在Rails中修补Time类会导致时区混乱

时间:2012-09-24 14:32:29

标签: ruby-on-rails ruby

我在Ruby 1.8.7上运行了一个Rails 3.2.6应用程序。该应用程序配置为使用中欧时间(即UTC + 2)作为其时区,在我的初始化程序中,我使用一些自定义功能进行猴子修补TimeDateTime

奇怪的是,在我的猴子修补方法中,时间/日期时间实例就好像它们是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.inspectDateTime.now.foo的相同且正确的结果。但是为DateTime属性做同样的事情,给我上面看到的奇怪行为。

知道为什么会发生这种情况(以及如何解决)?

1 个答案:

答案 0 :(得分:1)

Rails使用ActiveSupport::TimeWithZone作为时间属性,而非常规Ruby Time。尝试修补ActiveSupport::TimeWithZone

class ActiveSupport::TimeWithZone
  include MonkeyPatching
end