2016-02-29 2 views
5

Сегодня 29 февраля: день наших испытаний сломался.Рельсы TimeWithZone и високосные годы

Наши тесты терпят неудачу, потому что эти тесты делают то, что в конце концов можно сравнить с такой командой: Time.zone.now - 1.year + 1.year. И это бывает NOT, равное Time.zone.now.

Почему это происходит? Почему ActiveSupport не способен обрабатывать високосные годы в таких вычислениях? Разве это не работает с метками времени, которые предотвратили бы такую ​​проблему?

+0

Если вы тестируете его сегодня, у вас есть неудача ... Сегодня 29 февраля, который существует только один раз в 4 года. Итак, 'Time.zone.now' +' 1.year' доставит вас до 28 февраля, потому что 29-го не существует на 2017 год. '1.year.from_now' также вернет 28 февраля 2017 года – MrYoshiji

+0

Да, я это понимаю. Но почему, например, «Time.zone.now + 1.year» равен 1 марта? На мой взгляд, это было бы более уместно. – Guilherme

+1

Time.zone.now - 365.days + 365.days, похоже, работает, хотя ... – tobmatth

ответ

0

Вы можете использовать 4 года вместо 1 для того же эффекта. (Примечание: - 1.day, потому что 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' никогда не будет работать, вы должны храните 'Time.zone.now' в переменной. – Guilherme

+0

Да, правда, но он работает на дату: 'Date.today == Date.today - 1.year + 1.year' – Jaliso

Смежные вопросы