我有一个在 Ruby 1.8.7 上运行的 Rails 3.2.6 应用程序。该应用程序配置为使用中欧时间(即 UTC+2)作为其时区,在我的初始化程序中,我使用猴子补丁Time
和DateTime
一些自定义功能。
奇怪的是,在我的猴子补丁方法中,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 控制台中,我得到相同且正确的结果 forDateTime.now.inspect
和 for DateTime.now.foo
。但是对 DateTime 属性做同样的事情,给我上面看到的奇怪行为。
知道为什么会发生这种情况(以及如何解决它)吗?