Konvertieren des UTC-Zeitstempels in ISO 8601 in Ruby

83

Ich habe einen Zeitstempel in UTC

"2010-10-25 23:48:46 UTC"

Ich muss es in ISO 8601 konvertieren

29.10.2010 06: 09Z

Die Dokumentation ist verdammt verwirrend - wie geht das am einfachsten?

ming yeow
quelle

Antworten:

182

Ich denke, Sie versuchen uns auszutricksen.

Das Eingabedatum für Ihre Frage ist der 25. Oktober 2010 , während das Ausgabedatum der 29. Oktober 2010 ist . Gut gespielt!

Fahren Sie mit diesem Nit-Picking-Thread fort: Ihre Zeiten sind ebenfalls völlig anders und Sie verpassen die Sekunden der Ausgabezeit.

Nun zur wahren Antwort.

Zunächst ein kleines Faktoid: Die Ausgabe von ISO 8601 in Ruby ähnelt der Ausgabe von "Kombiniertes Datum und Uhrzeit" auf der Wikipedia-Seite von ISO 8601 .

Sie haben eine Zeichenfolge und müssen diese in ein TimeObjekt konvertieren, mit dem Sie arbeiten können to_time. Dann müssen Sie nur noch iso8601dieses Objekt aufrufen , um die ISO 8601-Version zu erhalten:

"2010-10-25 23:48:46 UTC".to_time.iso8601

Die to_timeMethode wurde von Rails zur Verfügung gestellt, während die iso8601von Rubys Standardbibliothek zur Verfügung gestellt wurde.

Ryan Bigg
quelle
7
Gute Antwort, aber ich habe den ersten Teil nicht bekommen (sollte das Humor sein?)
Mark Thomas
5
Verdammt! Du hast meine Verschwörung durchschaut, um dich auszutricksen. = P Danke für die tolle Antwort, ich frage mich, warum sie das nicht einfach in die Dokumentation schreiben!
Ming Yeow
13
@ Mark Thomas: Ja, es sollte Humor sein. Er gab eine Eingabe und eine Ausgabezeit, die niemals übereinstimmen würden. Tricksie kleiner Hobbit!
Ryan Bigg
Dies funktioniert, aber obwohl seine Frage fragte, wie man es in Rubin macht, ging es nicht davon aus, dass es sich um eine Schienenumgebung handelt.
Courtsimas
1
Verwandte, danke, dass Sie mich auf 'to_time' ~ Time.now.iso8601-Formate wie "2010-10-25T23: 48: 46Z" hingewiesen haben, wenn Sie '+00: 00' anstelle von 'Z' verwenden möchten (was ich hatte) für ein Legacy-System) Time.now.to_time.iso8601 scheint dies zu tun.
lucygenik
21

Nach langem Experimentieren finde ich, dass der Parser der Zeitbibliothek besser ist als DateTime, obwohl mir die Gründe im Moment entgehen. Mit dieser Einschränkung verwende ich für solche Dinge immer eher Time als DateTime, und die Ruby-Dokumentation ist auch schwer zu verstehen, warum dies so ist.

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Steeve McCauley
quelle
5
gute reine Rubinlösung. Wenn Sie nicht hinzufügen möchten, dass die ursprüngliche Zeit nicht UTC ist, möchten Sie möglicherweise Time.parse("...").utc.iso8601Folgendes : Andernfalls erhalten Sie die angehängte Zeit +03:00oder einen anderen Wert, abhängig von der Zeitzone, mit der die ursprüngliche Zeitzeichenfolge angegeben ist. Ich meine statt Z.
Akostadinov
4

Hinweis: Sie müssen eine Zeitzeichenfolge in ein Zeitobjekt konvertieren (analysieren), bevor Sie die Methode to_time anwenden können.

ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
    from (irb):16

Richtige Vorgehensweise:

irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 
Flugname
quelle
1

Hinzufügen einer Antwort auf diese super alte Frage, denn wenn Sie Rails verwenden, müssen Sie sie nicht so konvertieren / analysieren, wie es die anderen Antworten hier vorschreiben:

  • Wenn es sich bereits um einen Zeitstempel handelt (z. B. ein created_atoder ein updated_atAttribut), können Sie die Methode für diesen Zeitstempel (z . B. ) direkt aufrufen .iso8601object.created_at.iso8601
  • Die iso8601Methode akzeptiert auch ein numerisches Argument, um gebrochene Ziffern anzuzeigen. Sie würden dies verwenden, wenn Sie möchten, 2020-04-06T19:16:55.604Zanstatt 2020-04-06T19:16:55Z.

https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601

Allison
quelle