Ruby / Rails: conversione di una data in un timestamp UNIX


202

Come ottenere un timestamp UNIX (numero di secondi dal 1970 GMT) da un oggetto Date in un'app Rails?

So che Time#to_irestituisce un timestamp, ma fare Date#to_timee quindi ottenere il timestamp si traduce in qualcosa che è spento di circa un mese (non so perché ...).

Qualsiasi aiuto è apprezzato, grazie!

Modifica: OK, penso di averlo capito: stavo elaborando una data più volte in un ciclo, e ogni volta che la data veniva spostata un po 'a causa di una mancata corrispondenza del fuso orario, che alla fine portava al mio timestamp che era un mese libero. Tuttavia, sarei interessato a sapere se c'è un modo per farlo senza fare affidamento Date#to_time.

Risposte:


350

Il codice date.to_time.to_idovrebbe funzionare correttamente. La sessione della console Rails di seguito mostra un esempio:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

Si noti che l'oggetto DateTime intermedio è nell'ora locale, quindi la data e l'ora potrebbero essere diverse ore rispetto a quanto previsto. Se vuoi lavorare in orario UTC, puoi usare il metodo DateTime "to_utc".


3
DateTime non hato_utc
Verde

12
date.to_time.utcè probabilmente quello che intendeva dire.
Adam Eberlin,

3
In Rails, tramite ActiveSupport, un'istanza di DateTime ha un metodo utc () (anche aliasato per getutc)
Gokul,

71

Ottengo quanto segue quando lo provo:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

La differenza tra questi due numeri è dovuta al fatto che Datenon memorizza le ore, i minuti o i secondi dell'ora corrente. La conversione Datedi a Timein comporterà quel giorno, mezzanotte.


9

Le opzioni suggerite di utilizzo to_utco utcdi correzione dell'ora locale non funzionano. Per me ho scoperto che Time.utc()funzionava correttamente e il codice prevede meno passaggi:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

vs

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

Ecco cosa succede quando chiami utc dopo aver usato Date....

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

... così chiaramente chiamare to_ista per dare il timestamp sbagliato.


8

Soluzione per Ruby 1.8 quando si dispone di un oggetto DateTime arbitrario:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.