2016-03-23 26 views
7

Posso fare in modo che Rails applichi la stessa logica al mio calcolo in secondi come fa per il mio calcolo in anni?In Rails, perché 1.year.from_now non è lo stesso di 1.year.to_i.seconds.from_now?

puts "#{1.year.from_now} | #{1.year.to_i.seconds.from_now}" 
2017-03-23 18:48:06 UTC | 2017-03-24 00:48:06 UTC 

Non capisco da dove viene la differenza di 6 ore.

+0

Quale versione di binari stai usando? Sto ottenendo la stessa cosa per entrambi. – omarvelous

+0

Era in 4.2.1. Ho appena provato l'aggiornamento alla 4.2.6 e ottengo lo stesso risultato. – djb

risposta

9

La differenza è 6 ore. Ed è perché 1 anno in secondi (come convertito dal metodo to_i) è definito come 365,25 giorno in Ruby on Rails estensioni fondamentali:

>> 1.year.to_i/60/60/24.0 
=> 365.25 

Quei 0.25 giorni è l'attuale differenza 6 ore. In questo modo, RoR sta cercando di contare negli anni bisestili che (per basic approximation) si verificano una volta ogni 4 anni. Lo stesso è anche evidente dalla definizione years in Rails source code.

D'altra parte 1.year.from_now esegue invece uno spostamento di un calendario datetime. Come se avessi voltato le pagine sul tuo calendario murale.

+1

Grazie. Per la cronaca, stavo memorizzando la durata in secondi in un tavolo e volevo che fosse applicato in modo intelligente quando l'ho usato. Non ho bisogno di precisione sopra i mesi, quindi ho finito con '(duration.to_i/1.month.to_i) .months.da_now'. – djb

+0

È terribile. Buono a sapersi e ottima risposta, ma comunque terribile. –

+0

@Matt Perché? Mi sembra abbastanza ragionevole poiché l'espressione "1 anno" significa solo una quantità astratta di tempo che non si riferisce ad alcuna data e ora concreta. Quindi rubino cerca di spiegare gli anni bisestili che di solito si verificano una volta ogni 4 anni. Se non lo facesse (se '1.year 'sarebbe uguale a solo' 365.days') di un'espressione dell'intervallo di tempo più lungo sarebbe seriamente sbagliato, ad es. "ora + 10 anni" potrebbe essere esaurito di 2 giorni. – BoraMa