2016-02-29 1 views
5

Aujourd'hui est le 29 février: le jour où nos tests ont éclaté.Rails TimeWithZone et les années bissextiles

Nos tests échouent parce que ces tests font des choses qui, à la fin, peuvent être comparées à une commande comme celle-ci: Time.zone.now - 1.year + 1.year. Et il se trouve être PAS égale à Time.zone.now.

Pourquoi cela se produit-il? Pourquoi ActiveSupport n'est-il pas capable de gérer les années bissextiles dans des calculs comme celui-là? Cela ne fonctionne-t-il pas avec les horodatages, cela empêcherait ce genre de problème de se produire?

+0

Si vous testez aujourd'hui, vous avez la malchance ... Aujourd'hui est le 29 Février, qui existe seulement tous les 4 ans. Donc 'Time.zone.now' +' 1.year' vous amènera au 28 février car le 29 n'existe pas pour l'année 2017. '1.year.from_now' sera aussi de retour le 28 février 2017 – MrYoshiji

+0

Oui, je comprends cela. Mais pourquoi 'Time.zone.now + 1.year' n'est-il pas égal au 1er mars, par exemple? À mon avis, ce serait plus approprié. – Guilherme

+1

Time.zone.now - 365.days + 365.days semble fonctionner si ... – tobmatth

Répondre

0

Vous pouvez utiliser 4 ans au lieu de 1 pour le même effet. (Note: - 1.day parce qu'il est le 1er Mars en ce moment)

(Time.zone.now - 1.day) - 4.year + 4.year 
=> Mon, 29 Feb 2016 15:12:58 UTC +00:00 

Il peut être intéressant de noter que (ci-dessous), quelle que soit la date.

Time.zone.now 
=> Tue, 01 Mar 2016 15:11:51 UTC +00:00 
Time.zone.now == Time.zone.now - 1.year + 1.year 
=> false 

Sauf si vous utilisez beginning_of_day:

(Time.zone.now - 1.day).beginning_of_day == ((Time.zone.now - 1.day) - 4.year + 4.year).beginning_of_day 
=> true 

En outre, il dépend de ce que vous essayez vraiment faire ... Pourquoi voudriez-vous tester Time.now - 1.year + 1.year?

aussi ...

1.year == 365.days 
=> false 
1.year == 365.25.days 
=> true 
+0

'Time.zone.now == Time.zone.now - 1.year + 1.year' ne fonctionnera jamais, vous devez stocker 'Time.zone.now' dans une variable. – Guilherme

+0

Oui, true, mais cela fonctionne pour la date: 'Date.today == Date.today - 1.year + 1.year' – Jaliso