2016-02-29 11 views
5

Oggi è il 29 febbraio: il giorno in cui i nostri test si sono interrotti.Rails TimeWithZone e anni bisestili

I nostri test non funzionano perché questi test fanno cose che, alla fine, possono essere paragonati a un comando come questo: Time.zone.now - 1.year + 1.year. E capita di essere NON uguale a Time.zone.now.

Perché succede? Perché ActiveSupport non è in grado di gestire gli anni bisestili in calcoli del genere? Non funziona con i timestamp, questo impedirebbe questo tipo di problema?

+0

Se si esegue il test oggi, si dispone di sfortuna ... Oggi è il 29 febbraio, che esiste solo ogni 4 anni. Quindi "Time.zone.now' +" 1.year "ti porterà fino al 28 febbraio perché il 29 non esiste per l'anno 2017." 1.year.from_now' restituirà anche il 28 febbraio 2017 – MrYoshiji

+0

Sì, lo capisco. Ma perché "Time.zone.now + 1.year" è uguale al 1 ° marzo, ad esempio? A mio parere sarebbe più appropriato. – Guilherme

+1

Time.zone.now - 365.days + 365.days sembra funzionare però ... – tobmatth

risposta

0

È possibile utilizzare 4 anni anziché 1 per lo stesso effetto. (Nota: - 1.day perché è 1 marzo in questo momento)

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

Può valere la pena di notare che (al di sotto), a prescindere dalla data.

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

A meno che non si utilizza beginning_of_day:

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

Inoltre, dipende da cosa si sta effettivamente cercando di fare ... Perché si vuole testare Time.now - 1.year + 1.year?

anche ...

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

'Time.zone.now == Time.zone.now - 1.year + 1.year' non funzionerà mai, devi memorizzare 'Time.zone.now' in una variabile. – Guilherme

+0

Sì, è vero, ma funziona per data: 'Date.today == Date.today - 1.year + 1.year' – Jaliso