Ruby / Rails: Konvertieren eines Datums in einen UNIX-Zeitstempel

202

Wie würde ich einen UNIX-Zeitstempel (Anzahl der Sekunden seit 1970 GMT) von einem Date-Objekt in einer Rails-App erhalten?

Ich weiß, dass Time#to_iein Zeitstempel zurückgegeben wird, aber das Ausführen Date#to_timeund anschließende Abrufen des Zeitstempels führt zu einer Abweichung von etwa einem Monat (nicht sicher, warum ...).

Jede Hilfe wird geschätzt, danke!

Bearbeiten: OK, ich glaube, ich habe es herausgefunden. Ich habe ein Datum mehrmals in einer Schleife verarbeitet und jedes Mal wurde das Datum aufgrund einer Zeitzoneninkongruenz ein wenig verschoben, was letztendlich dazu führte, dass mein Zeitstempel einen Monat frei war. Trotzdem würde mich interessieren, ob es eine Möglichkeit gibt, dies zu tun, ohne sich darauf zu verlassen Date#to_time.

igul222
quelle

Antworten:

350

Der Code date.to_time.to_isollte gut funktionieren. Die folgende Rails-Konsolensitzung zeigt ein Beispiel:

>> 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

Beachten Sie, dass sich das Zwischenobjekt DateTime in der Ortszeit befindet, sodass der Zeitstempel möglicherweise einige Stunden von Ihren Erwartungen abweicht. Wenn Sie in UTC-Zeit arbeiten möchten, können Sie die DateTime-Methode "to_utc" verwenden.

David Grayson
quelle
3
DateTime hat nichtto_utc
Green
12
date.to_time.utcist wahrscheinlich das, was er meinte.
Adam Eberlin
3
In Rails verfügt eine DateTime-Instanz über ActiveSupport über eine utc () -Methode (ebenfalls mit dem Alias ​​getutc)
Gokul,
71

Ich bekomme folgendes, wenn ich es versuche:

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

Der Unterschied zwischen diesen beiden Zahlen ist darauf zurückzuführen, dass Datedie Stunden, Minuten oder Sekunden der aktuellen Zeit nicht gespeichert werden. Das Konvertieren von a Datein a Timeführt zu diesem Tag, Mitternacht.

Ryan Bigg
quelle
9

Die vorgeschlagenen Optionen zum Verwenden to_utcoder utcKorrigieren des lokalen Zeitversatzes funktionieren nicht. Für mich hat die Verwendung Time.utc()richtig funktioniert und der Code umfasst weniger Schritte:

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

vs.

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

Folgendes passiert, wenn Sie utc nach der Verwendung aufrufen 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

... so klar, dass ein Anruf to_iden falschen Zeitstempel ergibt.

Gerry
quelle
8

Lösung für Ruby 1.8, wenn Sie ein beliebiges DateTime-Objekt haben:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
Nowaker
quelle
4
DateTime.new(2012, 1, 15).to_time.to_i
Wang Himmel
quelle