这里是:
Time.zone.now => "Eastern Time (US & Canada)"
Time.zone.now => Wed, 15 Aug 2012 06:05:37 EDT -04:00
Time.zone.now + 39.years => Tue, 15 Aug 2051 06:06:03 EST -05:00
所以你拥有它,我们传说中的东方夏令时的结束已经被Ruby on Rails预言到2051年结束。
也适用于任何其他TimeZone更改区域。
Time.zone
=> "Pacific Time (US & Canada)"
1.9.2p180 :003 > Time.zone.now
=> Wed, 15 Aug 2012 03:08:57 PDT -07:00
1.9.2p180 :004 > Time.zone.now + 39.years
=> Tue, 15 Aug 2051 03:08:57 PST -08:00
这存在于Rails 3.0和Rails 3.2.6
中答案 0 :(得分:1)
是的,它看起来像一个bug。这不是Rails,但是,它是Ruby Time 类。它在2038年之后出现了问题。
例如,使用Ruby 1.8.7:
> Time.local(2037,8,16,9,30,15)
=> Sun Aug 16 09:30:15 -0400 2037
>
> Time.local(2038,8,16,9,30,15)
=> Mon Aug 16 09:30:15 -0500 2038
JRuby 1.6.7.2 - 例如 - 没有这个问题:
> Time.local(2038,8,16,9,30,15)
=> Mon Aug 16 09:30:15 -0400 2038
请注意,在64位系统上的MRI Ruby上,支持添加持续时间的ActiveSupport时间扩展最终通过active_support / core_ext / time / computation.rb中的此方法调用Time.local或Time.utc:
# Returns a new Time if requested year can be accommodated by Ruby's Time class
# (i.e., if year is within either 1970..2038 or 1902..2038, depending on system architecture);
# otherwise returns a DateTime
def time_with_datetime_fallback(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
::Time.send(utc_or_local, year, month, day, hour, min, sec, usec)
rescue
offset = utc_or_local.to_sym == :local ? ::DateTime.local_offset : 0
::DateTime.civil(year, month, day, hour, min, sec, offset)
end
我想问题是,多年> = 2038,他们期待溢出异常并且使用DateTime代替。在64位系统上,这不会发生。
更新:此分析对于Ruby 1.9.2+不正确。 Time.local按预期工作,但原始问题仍然存在。