繁体   English   中英

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

[英]Monkey-patching the Time class in Rails leads to time zone confusion

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

奇怪的是,在我的猴子补丁方法中,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!)

因此,在model.created_at上直接调用inspect会给我正确的时区调整结果。 但是,调用已修补的方法foo也只是调用inspect -将时间视为UTC,即使并非如此。

更令人困惑的是,这仅发生在模型属性上。 即在r​​ails控制台中,对于DateTime.now.inspectDateTime.now.foo ,我得到相同且正确的结果。 但是对DateTime属性做同样的事情,请给我上面看到的奇怪行为。

任何想法为什么会发生这种情况(以及如何解决)?

Rails使用ActiveSupport::TimeWithZone作为时间属性,而不是常规的Ruby Time 尝试也修补ActiveSupport::TimeWithZone

class ActiveSupport::TimeWithZone
  include MonkeyPatching
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM