Wie bekomme ich einen UTC-Zeitstempel in Ruby?


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 .


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.


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"

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

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

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


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 = Time.zone.now()

Es wird funktionieren als

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.