设定时间.在帕德里诺区



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

在我的靴子。我有

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

当我点击索引操作时,我得到nil的time。zone。好像有什么东西在覆盖时间。

  • 我可以在boot.rb中设置时区后打印出来。所以我知道它是设置的。

你可以这样设置:

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

这就是你所需要的,但详见下文。

上面的工作为我与activessupport 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中分配区域时并不总是如此。我没有深入研究这个问题,但我确信会找到一个更好的解决方案,在每个线程中分配它。

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

在我的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 

注意:已测试ruby v2.1.4, padrino v0.12.4, activessupport/activerecord v4.2.0。

相关内容

  • 没有找到相关文章

最新更新