首页 > 解决方案 > 仅控制器中的时区设置

问题描述

我有一个 Rails 应用程序,我在控制器的 before 操作中为每个请求设置时区,如下所示:

Time.zone="Central Time (US & Canada")

我可以打印时区

puts Time.zone

这就是打印出来的。

(GMT-06:00) Central Time (US & Canada)

在我调用模型中的方法之前,所有这些都可以正常工作。当我这样做时,时区会丢失,我必须Time.zone在我的模型中重新设置。

如果我在我的模型中调用下面的方法,它会从我的控制器打印 UTC 时间。

模型

def self.import_file(file)
    puts Time.zone
    # this prints out UTC time. 
end

这是预期的行为还是我错过了什么?

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


Time.zone设置为线程变量。如果您在不同的线程中(即后台工作者、进程、irb),Time.zone将是您的应用程序的默认值(通常设置在 中config/application.rb)。

如果您不在其他线程/进程中,请确保您没有意外调用Time.zone = nil. 您还应该查看http://api.rubyonrails.org/classes/Time.html#method-c-use_zoneTime.use_zone上的 Rails 权威示例。


推荐阅读