Ich habe folgendes Datum : 2011-08-12T20:17:46.384Z
. Welches Format ist das? Ich versuche es mit Java 1.4 über zu analysieren DateFormat.getDateInstance().parse(dateStr)
und ich bekomme
java.text.ParseException: Nicht analysierbares Datum: "2011-08-12T20: 17: 46.384Z"
Ich denke, ich sollte SimpleDateFormat zum Parsen verwenden, aber ich muss zuerst die Formatzeichenfolge kennen. Alles, was ich bisher dafür habe, ist yyyy-MM-dd
, weil ich nicht weiß, was die Bedeutung T
in dieser Zeichenfolge bedeutet - etwas Zeitzonenbezogenes? Diese Datumszeichenfolge stammt von dem lcmis:downloadedOn
Tag, das im Medientyp "Dateien CMIS-Downloadverlauf" angezeigt wird .
Z
am Ende steht für UTCZulu
und bedeutet . Dieses Format mit Sicherheit ist Teil der ISO 8601 Sammlung von Standard - Datum-Zeit - Textformaten. Diese Standardformate werden übrigens standardmäßig in den Klassen java.time verwendet.java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .Antworten:
Das T ist nur ein Literal, um das Datum von der Uhrzeit zu trennen, und das Z bedeutet "Null-Stunden-Versatz", auch als "Zulu-Zeit" (UTC) bekannt. Wenn Ihre Zeichenfolgen immer ein "Z" haben, können Sie Folgendes verwenden:
Oder mit Joda Time können Sie verwenden
ISODateTimeFormat.dateTime()
.quelle
T
undZ
?T
(ich kann mich nicht erinnern, wie SimpleDateFormat mit unbekannten Spezifizierern umgeht), aberZ
wir möchten, dass es das Zeichen 'Z' und nicht "ein UTC-Versatzwert" (z. B. "00") ist.tl; dr
Das Standardformat ISO 8601 wird von Ihrer Eingabezeichenfolge verwendet.
ISO 8601
Dieses Format wird durch die sinnvolle praktische Norm ISO 8601 definiert .
Das
T
trennt den Datumsanteil vom Tageszeitteil. DasZ
am Ende bedeutet UTC (dh ein Versatz von UTC von null Stunden-Minuten-Sekunden). DasZ
wird "Zulu" ausgesprochen .java.time
Die alten Datums- und Uhrzeitklassen, die mit den frühesten Versionen von Java gebündelt wurden, haben sich als schlecht gestaltet, verwirrend und problematisch erwiesen. Vermeide sie.
Verwenden Sie stattdessen das in Java 8 und höher integrierte java.time- Framework. Die java.time-Klassen ersetzen sowohl die alten Datums- / Uhrzeitklassen als auch die äußerst erfolgreiche Joda-Time-Bibliothek.
Die java.time-Klassen verwenden standardmäßig ISO 8601, wenn Textdarstellungen von Datums- und Uhrzeitwerten analysiert / generiert werden.
Die
Instant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden . Diese Klasse kann Ihre Eingabezeichenfolge direkt analysieren, ohne ein Formatierungsmuster definieren zu müssen.Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Ich bin mir nicht sicher über das Java-Parsing, aber das ist ISO8601: http://en.wikipedia.org/wiki/ISO_8601
quelle
Es gibt andere Möglichkeiten, es zu analysieren, als die erste Antwort. So analysieren Sie es:
(1) Wenn Sie Informationen zu Datum und Uhrzeit abrufen möchten, können Sie sie in ein
ZonedDatetime
(seit Java 8 ) oderDate
(altes) Objekt analysieren :oder
(2) Wenn Sie sich nicht um Datum und Uhrzeit kümmern und die Informationen nur als einen Moment in Nanosekunden behandeln möchten, können Sie Folgendes verwenden
Instant
:quelle
Wenn Sie nach einer Lösung für Android suchen, können Sie den folgenden Code verwenden, um die Sekunden der Epoche aus der Zeitstempelzeichenfolge abzurufen.
Beispieleingabe: 2019-10-15T05: 51: 31.537979Z
Beispielausgabe: 1571128673
quelle
Sie können das folgende Beispiel verwenden.
quelle
Z
. Das bedeutet, diesen Brief zu erwarten, aber zu ignorieren. Aber dieser Brief sollte nicht ignoriert werden. Dieser Brief liefert wertvolle Informationen, die Tatsache, dass die Zeichenfolge für UTC bestimmt war, einen Versatz von Null. Ihr Format verwirft diese wichtige Tatsache. Darüber hinaus müssen Sie dieses Formatierungsmuster nicht einmal definieren. Ein Formatierer für dieses Muster ist eingebaut.Diese Technik übersetzt java.util.Date in das UTC-Format (oder ein anderes) und wieder zurück.
Definieren Sie eine Klasse wie folgt:
}}
Dann benutze es so:
oder
Sie können bei Bedarf auch andere Datumsformate definieren (nicht nur UTC).
quelle
java.util.Date
und das Joda-Time- Projekt wurden vor Jahren durch die modernen java.time- Klassen ersetzt, die in JSR 310 definiert sind. Der Rat hier ist längst veraltet.@ John-Skeet gab mir den Hinweis, mein eigenes Problem zu beheben. Als jüngerer Programmierer ist dieses kleine Problem leicht zu übersehen und schwer zu diagnostizieren. Also teile ich es in der Hoffnung, dass es jemandem hilft.
Mein Problem war, dass ich die folgende Zeichenfolge analysieren wollte, die einem Zeitstempel aus einem JSON widerspricht, auf den ich keinen Einfluss habe, und ihn in nützlichere Variablen einfügen wollte. Aber ich bekam immer wieder Fehler.
Gehen Sie also wie folgt vor (achten Sie auf den String-Parameter in Pattern ();
Error:
Das Problem? Das Z am Ende des Musters muss genau wie das 'T' in 'Z' eingewickelt werden. Wechseln Sie
"yyyyMMdd'T'HHmmss.SSSZ"
zu"yyyyMMdd'T'HHmmss.SSS'Z'"
und es funktioniert.Das Entfernen des Z aus dem Muster insgesamt führte ebenfalls zu Fehlern.
Ehrlich gesagt würde ich erwarten, dass eine Java-Klasse dies vorweggenommen hat.
quelle
T
ist ein Literal und muss in Anführungszeichen gesetzt werden,Z
ist ein Offset (von Null) und muss als solches analysiert werden, sonst erhalten Sie falsche Ergebnisse. Ich weiß nicht, was du meinst, dass es nicht erwartet wurde, ich glaube, dass es hat.Z
. Sie verwerfen wertvolle Informationen. Das Verarbeiten eines Datums- / Uhrzeitwerts unter Ignorieren der Zeitzone oder des Versatzes von UTC ist wie das Verarbeiten eines Geldbetrags unter Ignorieren der Währung!T
trennt lediglich den Datumsanteil vom Tageszeitteil und fügt keine Bedeutung hinzu. DasZ
auf der anderen Seite fügt definitiv Bedeutung hinzu.