Frage Konvertieren von UTC-Timestamp nach ISO 8601 in Ruby


Ich habe einen Zeitstempel, der in UTC ist

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

Ich muss es in ISO 8601 umwandeln

"2010-10-29 06: 09Z"

Die Dokumentation ist irreführend - was ist der einfachste Weg?


75
2017-10-30 02:39


Ursprung


Antworten:


Ich denke du versuchst uns auszutricksen.

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

Weiter geht es mit diesem nick-pickenden Thread: Ihre Zeiten sind auch völlig anders und Sie verpassen die Sekunden aus der Ausgabezeit.

Jetzt für die wahre Antwort.

Ein kleiner Fakto zuerst: Die Ausgabe von ISO 8601 in Ruby ähnelt der Ausgabe von "Kombiniertes Datum und Uhrzeit" von ISO 8601 Wikipedia-Seite.

Sie haben eine Zeichenfolge und müssen diese in eine konvertieren Time Objekt, mit dem Sie arbeiten können to_time. Dann ist es einfach eine Berufung iso8601 auf dieses Objekt, um die ISO 8601-Version zu erhalten:

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

Das to_time Methode ist mit freundlicher Genehmigung von Rails, während die iso8601 ist mit freundlicher Genehmigung von Ruby's Standard-Bibliothek.


162
2017-10-30 03:23



Nach vielem Experimentieren finde ich den Parser der Zeitbibliothek besser als DateTime, obwohl die Gründe mir im Moment entgehen. Mit diesem Vorbehalt verwende ich für diese Art von Material immer Time statt DateTime, und die Ruby-Dokumentation ist auch schwer zu verstehen, warum das so ist.

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

19
2017-08-21 14:36



Hinweis: Sie müssen eine Zeitzeichenfolge in ein Zeitobjekt konvertieren (parsen), 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

Richtiges Vorgehen:

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

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

2
2017-12-05 02:40