2016-02-29 70 views
5

今天是2月29日:我們的測試破裂的那一天。Rails TimeWithZone和閏年

我們的測試失敗了,因爲這些測試可以做的事情最終可以與這樣的命令進行比較:Time.zone.now - 1.year + 1.year。它恰好是不是等於Time.zone.now

爲什麼會發生這種情況?爲什麼ActiveSupport不能像這樣計算閏年?它是否與時間戳一起工作,可以防止這類問題的發生?

+0

如果你今天測試它,你有一個壞運氣......今天是2月,只存在每4年的第29位。因此'Time.zone.now' +'1.year'會讓你到2月28日,因爲第29年在2017年不存在。'1.year.from_now'也將返回2017年2月28日 – MrYoshiji

+0

是的,我明白這一點。但爲什麼不是'Time.zone.now + 1.year'等於3月1日,例如?在我看來,這會更合適。 – Guilherme

+1

Time.zone.now - 365.days + 365.days似乎工作雖然... – tobmatth

回答

0

對於相同的效果,您可以使用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 
+0

'Time.zone.now == Time.zone.now - 1.year + 1.year' will never work,you must將'Time.zone.now'存儲在一個變量中。 – Guilherme

+0

是的,真的,但它適用於日期:'Date.today == Date.today - 1.year + 1.year' – Jaliso