在Padrino中设置Time.zone

时间:2014-06-22 22:31:36

标签: ruby timezone padrino

我在padrino项目中设置默认的ActiveSupport :: TimeZone时遇到了问题。

在我的boot.rb中我有

Padrino.after_load do
  Time.zone = 'UTC'
  ActiveRecord::Base.default_timezone = :utc
end

我的控制器文件有:

MyApp::App.controllers :post do
  get :index do
    puts Time.zone # this returns nil
    render 'index'
  end
end

当我点击索引动作时,我的Time.zone为零。似乎有些东西可能会覆盖Time.zone,或者它没有正确加载。

  • 我可以在boot.rb中设置时区后打印出时区。所以我知道它已经确定了。

2 个答案:

答案 0 :(得分:0)

boot.rb我得到了:

Padrino.before_load do
  Time.zone = 'UTC'
end

和我的database.rb

ActiveRecord::Base.default_timezone = :utc

在控制台中进行过测试似乎有效:

ruby-2.1.4$ padrino c
 => Loading development console (Padrino v.0.12.4)
2.1.4 :001 > Time.zone 
 => #<ActiveSupport::TimeZone:0x007fbff62ed5c0 @name="UTC", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Etc/UTC>, @current_period=#<TZInfo::TimezonePeriod: nil,nil,#<TZInfo::TimezoneOffset: 0,0,UTC>>>> 
2.1.4 :002 > Time.zone.now
 => Tue, 30 Dec 2014 13:14:57 UTC +00:00 
2.1.4 :003 > Time.current
 => Tue, 30 Dec 2014 13:15:01 UTC +00:00 
2.1.4 :004 > ActiveRecord::Base.default_timezone
 => :utc 

N.B。使用ruby v2.1.4,padrino v0.12.4,activesupport / activerecord v4.2.0进行测试。

答案 1 :(得分:0)

您可以这样设置:

Time.zone_default = Time.find_zone!("UTC")

这就是您所需要的,但请参阅下面的详细信息。

上面的内容适用于activesupport 5.0.2。我看了Time.zone是如何实现的:

class Time
  include DateAndTime::Zones
  class << self
    attr_accessor :zone_default

    # Returns the TimeZone for the current request, if this has been set (via Time.zone=).
    # If <tt>Time.zone</tt> has not been set for the current request, returns the TimeZone specified in <tt>config.time_zone</tt>.
    def zone
      Thread.current[:time_zone] || zone_default
    end

然后我猜到在Padrino的当前主题中可能会丢失它。

大概需要为每个线程设置Time.zone一次。无论出于何种原因,在Padrino.before_load中分配区域时并非总是如此。我没有深入研究这个问题,但我确信在每个帖子中都有一个更好的解决方案。

如果您想要每个用户的时区,而不仅仅是整个应用的全局时区,则需要进一步挖掘。