我在Ruby 1.8.7上运行了一个Rails 3.2.6应用程序。该应用程序配置为使用中欧时间(即UTC + 2)作为其时区,在我的初始化程序中,我使用一些自定义功能进行猴子修补Time
和DateTime
。
奇怪的是,在我的猴子修补方法中,时间/日期时间实例就好像它们是UTC(但使用时区调整后的值),但在应用程序的其他地方它们尊重时区配置
因此,作为一个例子,在config/initializers/monkey_patching.rb
我有以下
module MonkeyPatching
def foo
inspect
end
end
class Time
include MonkeyPatching
end
class DateTime
include MonkeyPatching
end
现在,在应用程序的其他地方(或在rails控制台中),这就是我得到的内容
model.created_at.inspect #=> "Mon, 24 Sep 2012 15:06:34 CEST +02:00" (correct!)
model.created_at.foo #=> "Mon Sep 24 15:06:34 UTC 2012" (all wrong!)
因此,在inspect
上直接调用model.created_at
“会给我正确的时区调整结果。但是调用修补后的方法foo
- 它也只是调用inspect
! - 将时间视为UTC,即使它不是。
为了增加我的困惑,这只发生在模型属性上。即在rails控制台中,我得到DateTime.now.inspect
和DateTime.now.foo
的相同且正确的结果。但是为DateTime属性做同样的事情,给我上面看到的奇怪行为。
知道为什么会发生这种情况(以及如何解决)?
答案 0 :(得分:1)
Rails使用ActiveSupport::TimeWithZone
作为时间属性,而非常规Ruby Time
。尝试修补ActiveSupport::TimeWithZone
。
class ActiveSupport::TimeWithZone
include MonkeyPatching
end