Wie bekomme ich einen UTC-Zeitstempel in Ruby?

136

Wie bekomme ich einen UTC-Zeitstempel in Ruby?

Mohit Jain
quelle

Antworten:

116
time = Time.now.getutc

Begründung: In meinen Augen ist ein Zeitstempel genau das: Ein Zeitpunkt. Dies kann mit einem Objekt genau dargestellt werden. Wenn Sie etwas anderes benötigen, einen Skalarwert, z. B. Sekunden seit der Unix-Epoche, 100-ns-Intervalle seit 1601 oder eine Zeichenfolge für Anzeigezwecke oder zum Speichern des Zeitstempels in einer Datenbank, können Sie diesen problemlos vom Objekt abrufen. Das hängt jedoch sehr stark von Ihrem Verwendungszweck ab.

Zu sagen, dass »ein echter Zeitstempel die Anzahl der Sekunden seit der Unix-Epoche ist«, fehlt ein wenig, da dies eine Möglichkeit ist, einen Zeitpunkt darzustellen, aber es werden auch zusätzliche Informationen benötigt, um überhaupt zu wissen, dass Sie es zu tun haben eine Zeit und keine Zahl. Ein TimeObjekt löst dieses Problem gut, indem es einen Zeitpunkt darstellt und auch explizit angibt, was es ist .

Joey
quelle
92
Das gibt das Zeitobjekt, sollten Sie zu Time.now.to_i für einen wahren Zeitstempel
rafamvc
3
Meiner Meinung nach ist ein Objekt zeitstempelig genug und Sie haben immer noch die Freiheit, die Sie brauchen. Eine Reduzierung auf einen Skalarwert ist in den meisten Fällen nicht unbedingt erforderlich.
Joey
2
Zeitstempel sind relativ zur Epoche - egal in welcher Zeitzone Sie sich befinden. Manzhikovs Antwort ist die bessere.
Ryan Mohr
2
Dies ist zwar eine nette Erklärung, warum kein Unix-Zeitstempel verwendet werden soll, aber dies beantwortet nicht die OP-Frage (noch die gleiche Frage, die ich hatte, als ich diesen Beitrag gefunden habe). In vielen Fällen sind Unix-Zeitstempel erforderlich (z. B. für APIs). Selbst nach der Erklärung gab diese Antwort nicht den tatsächlichen Weg, um den Zeitstempel zu erhalten.
Stuckj
4
@stuckj, zu keinem Zeitpunkt wird in der Frage ein Unix-Zeitstempel erwähnt. Ich bekomme nur weiterhin Downvotes für diese Antwort, weil die Leute zu denken scheinen, dass »Zeitstempel == Unix-Zeit«, daher die Erklärung.
Joey
246

Sie könnten verwenden : Time.now.to_i.

Manzhikov
quelle
1
Wäre es sinnvoller, Time.now.getutc.to_i zu machen? Oder ist das im Wesentlichen gleichwertig?
Stuckj
20
Der Zeitstempel ist in allen Zeitzonen gleich. :)
Manzhikov
2
Oh ja, duh. Brainfart Frage. :)
Stuckj
Dies ist die am besten geeignete Antwort!
Darlan Dieterich
46

Die Standardformatierung ist meiner Meinung nach nicht sehr nützlich. Ich bevorzuge ISO8601, da es sortierbar, relativ kompakt und allgemein anerkannt ist:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"
Tim Sylvester
quelle
1
Beachten Sie, dass diese Methode von ActiveSupport stammt und nicht in der Standardbibliothek rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
n0nick
3
@ n0nick bist du dir sicher, auch in 2.0? Ich weiß, dass ich es bei "Vanilla" -Installationen ohne Schienen usw. verwendet habe, und es ist in /usr/share/ruby/2.0/time.rb.
Tim Sylvester
15

Normalerweise hat der Zeitstempel keine Zeitzone.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true
Yuki Matsukura
quelle
1
to_fwird besser sein
xis
1
es kommt auf die Situation an.
Yuki Matsukura
1
Wann hat ein Zeitstempel eine Zeitzone?
Dennis
1
Der Zeitstempel bezieht sich nicht auf die Zeitzone. Mit anderen Worten, der Zeitstempel ist UTC.
Yuki Matsukura
1
@YukiMatsukura Eigentlich ist das auch nicht ganz richtig. Ein Zeitstempel repräsentiert nicht einmal eine Zeitzone, daher ist "Zeitstempel ist UTC" genauso wahr wie "Zeitstempel ist Elefantenkot". Das Problem liegt in der Darstellung. Die meisten Entwickler stellen es als Unix-Zeitstempel dar (der keine UTC oder eine andere Zeitzone angibt, da es sich nur um einen ganzzahligen Wert handelt).
Der Pellmeister
10

Wenn Sie einen für Menschen lesbaren Zeitstempel benötigen (wie dies bei der Schienenmigration der Fall ist), z. " 20190527141340 "

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby
Kate Kasinskaya
quelle
7

Was nützt ein Zeitstempel, dessen Granularität in Sekunden angegeben wird? Ich finde es viel praktischer, damit zu arbeiten Time.now.to_f. Sie können sogar einen werfen to_s.sub('.',''), um den Dezimalpunkt zu entfernen, oder eine Typumwandlung wie folgt durchführen : Integer(1e6*Time.now.to_f).

Chava
quelle
Vielen Dank. Ich habe dies verwendet: Integer(1e3*Time.now.to_f)so dass mein serverseitiger Ruby-Zeitstempel der gleiche war wie clientseitiges JavascriptDate.now()
Joshweir
2

Time.utc(2010, 05, 17)

August Lilleaas
quelle
-2

time = Time.zone.now()

Es wird funktionieren als

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC
Sternchen
quelle
Jonathan, kannst du mir sagen, was an dieser Antwort falsch ist?
Sternchen
1
Dies hängt davon ab, welche Ruby-Dinge die lokale Zeitzone sind. Es funktioniert erwartungsgemäß nur, wenn die lokale TZ UTC ist.
MasterCheffinator
-6

Der richtige Weg ist, a zu tun Time.now.getutc.to_i, um den richtigen Zeitstempelbetrag zu erhalten, da die einfache Anzeige der Ganzzahl aufgrund von Zeitzonenunterschieden nicht immer mit dem utc-Zeitstempel übereinstimmen muss.

Sumit Bisht
quelle
7
Alle anderen sagten das. Warum also einfach 3 Jahre zu spät ohne neue Informationen kopieren?
Kaspar Lee
2
Und ohne Interpunktion würde der 1-Satz, der etwas zu lang und nicht vollständig syntaktisch korrekt ist, klarer werden.
Emile Vrijdags