2011-12-18 12 views
20

Sono un po 'confuso tra Data, Data e Ora in Ruby. Inoltre, la mia applicazione è sensibile ai fusi orari, e non sono sicuro di come convertire tra questi tre pur essendo robusti nel fuso orario.Controllare se due timestamp sono lo stesso giorno in Ruby

Come è possibile verificare se due timestamp unix (secondi dall'epoca) rappresentano lo stesso giorno? (In realtà non mi interessa se utilizza l'ora locale o l'ora UTC, mentre preferirei l'ora locale, a patto che sia coerente, posso progettare intorno a questo).

risposta

37

Utilizzando lo standard libreria, converti un oggetto Tempo in una data.

require 'date' 

Time.at(x).to_date === Time.at(y).to_date 

Data ha il metodo === che sarà vero se due oggetti Date rappresentano lo stesso giorno.

+0

È in UTC, quindi? – chimeracoder

+0

Le date e gli orari in Ruby sono a conoscenza del fuso orario. Quindi se crei l'oggetto Date usando UTC, allora sì sarà in UTC. Se li crei utilizzando una zona diversa, saranno in quella zona. – Anurag

+2

eh, perché è stato downvoted? – Anurag

5

ActiveSupport definisce nice to_date method per Time class. Ecco come sembra:

class Time 
    def to_date 
    ::Date.new(year, month, day) 
    end 
end 

Con esso si può confrontare timestamp del genere:

Time.at(ts1).to_date === Time.at(ts2).to_date 

E qui è il modo meno controverso senza estendere Time classe:

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1 
t2 = Time.at(ts2) 
Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day) 
+0

Questa domanda è contrassegnata con 'Ruby'; Non penso sia giusto presumere che stia usando Rails. –

+0

Sì, non sto usando Rails. Inoltre, Time.at (1324196871) .to_date == Time.at (1324253810) .to_date restituisce false per me ... converte automaticamente il timestamp in localtime per me? – chimeracoder

+0

Ma lui può definire lui stesso questo metodo di aiuto. Il codice è fornito. :-) –

2
Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400 

O

t1 = Time.at(ts1) 
t2 = Time.at(ts2) 
t1.yday == t2.yday && t1.year == t2.year 

Nel primo caso ci assicuriamo che i timestamp non sono altro che il giorno a parte (perché #day restituisce il giorno del mese e senza questo ulteriore controllo 1 aprile sarebbe pari a maggio 1)

Un'alternativa è quella di prendere giorno di anno e assicurarsi che siano dello stesso anno.

Questi metodi funzionano ugualmente bene sia 1.8 e 1.9 :-)

1

Possiamo usare beginning_of_day del tempo e confrontarli: t1.beginning_of_day == t2.beginning_of_day In questo modo non saranno interessati i fusi orari.

Problemi correlati