我在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,或者它没有正确加载。
答案 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
中分配区域时并非总是如此。我没有深入研究这个问题,但我确信在每个帖子中都有一个更好的解决方案。
如果您想要每个用户的时区,而不仅仅是整个应用的全局时区,则需要进一步挖掘。