2

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

奇怪的是,在我的猴子补丁方法中,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 属性做同样的事情,给我上面看到的奇怪行为。

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

4

1 回答 1

1

RailsActiveSupport::TimeWithZone用于时间属性,而不是常规的 Ruby Time。也试试补丁ActiveSupport::TimeWithZone

class ActiveSupport::TimeWithZone
  include MonkeyPatching
end
于 2012-09-24T15:45:14.937 回答