今天是2月29日:我們的測試破裂的那一天。Rails TimeWithZone和閏年
我們的測試失敗了,因爲這些測試可以做的事情最終可以與這樣的命令進行比較:Time.zone.now - 1.year + 1.year
。它恰好是不是等於Time.zone.now
。
爲什麼會發生這種情況?爲什麼ActiveSupport不能像這樣計算閏年?它是否與時間戳一起工作,可以防止這類問題的發生?
今天是2月29日:我們的測試破裂的那一天。Rails TimeWithZone和閏年
我們的測試失敗了,因爲這些測試可以做的事情最終可以與這樣的命令進行比較:Time.zone.now - 1.year + 1.year
。它恰好是不是等於Time.zone.now
。
爲什麼會發生這種情況?爲什麼ActiveSupport不能像這樣計算閏年?它是否與時間戳一起工作,可以防止這類問題的發生?
對於相同的效果,您可以使用4年而不是1年。 (注意: - 1.day因爲現在是3月1日)
(Time.zone.now - 1.day) - 4.year + 4.year
=> Mon, 29 Feb 2016 15:12:58 UTC +00:00
不管日期如何,可能值得注意的是(下面)。
Time.zone.now
=> Tue, 01 Mar 2016 15:11:51 UTC +00:00
Time.zone.now == Time.zone.now - 1.year + 1.year
=> false
除非你使用beginning_of_day:
(Time.zone.now - 1.day).beginning_of_day == ((Time.zone.now - 1.day) - 4.year + 4.year).beginning_of_day
=> true
而且,這取決於你實際上是試圖做...你爲什麼要考Time.now - 1.year + 1.year
?
也...
1.year == 365.days
=> false
1.year == 365.25.days
=> true
如果你今天測試它,你有一個壞運氣......今天是2月,只存在每4年的第29位。因此'Time.zone.now' +'1.year'會讓你到2月28日,因爲第29年在2017年不存在。'1.year.from_now'也將返回2017年2月28日 – MrYoshiji
是的,我明白這一點。但爲什麼不是'Time.zone.now + 1.year'等於3月1日,例如?在我看來,這會更合適。 – Guilherme
Time.zone.now - 365.days + 365.days似乎工作雖然... – tobmatth