Konvertieren einer ISO 8601-kompatiblen Zeichenfolge in java.util.Date
Ich versuche zu konvertieren ISO 8601 formatierten String, java.util.Datum.
Fand ich das Muster "yyyy-MM-dd NICHT'HH:mm:ssZ" werden nach ISO8601-konform, wenn verwendet mit einem Gebietsschema (Vergleiche Beispiel).
Allerdings wird die Verwendung der java.text."=SimpleDateFormat, ich kann nicht konvertieren, die korrekt formatierte Zeichenfolge "2010-01-01T12:00:00+01:00". Ich habe es vorher erst konvertieren zu "2010-01-01T12:00:00+0100" ohne den Doppelpunkt.
So, die aktuelle Lösung ist
SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));
die offensichtlich nicht nett. Übersehe ich etwas oder gibt es eine bessere Lösung?
Antwort
Dank JuanZe Kommentar, ich fand die Joda-Time Magie, es ist auch hier beschrieben.
So, die Lösung ist
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));
Oder einfach, verwenden Sie die Standard-parser über den Konstruktor:
DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;
Mir, das ist schön.
InformationsquelleAutor der Frage Ice09 | 2010-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider die Zeitzone Formaten zur Verfügung "=SimpleDateFormat (Java 6 und früher) sind nicht ISO 8601 konform. "=SimpleDateFormat versteht Zeitzone Zeichenfolgen wie "GMT+01:00" oder "+0100", der letztere nach RFC # 822.
Selbst wenn Java 7 Unterstützung für Zeitzonen-Deskriptoren gemäß ISO 8601, " = SimpleDateFormat ist noch nicht in der Lage, richtig zu analysieren, eine vollständige Datums-Zeichenfolge, da es noch keine Unterstützung für optionale Teile.
Neuformatieren der input-string mit regexp ist sicherlich eine Möglichkeit, aber die Ersatz-Regeln sind nicht so einfach wie in deiner Frage:
Die einfachere Lösung möglich ist, verwenden Sie den Datentyp-Konverter in JAXB, da JAXB muss in der Lage sein, zu analysieren, nach ISO8601 Datum Zeichenfolge gemäß dem XML-Schema-Spezifikation.
javax.xml.bind.DatatypeConverter.parseDateTime("2010-01-01T12:00:00Z")
wird Ihnen eineCalendar
Objekt und Sie können einfach mit getTime() auf, wenn Sie eineDate
Objekt.Könnten Sie wahrscheinlich verwenden, Joda-Time als gut, aber ich weiß nicht, warum Sie sich kümmern sollten.
InformationsquelleAutor der Antwort jarnbjo
Okay, diese Frage ist bereits beantwortet, aber ich lasse meine Antwort trotzdem. Es könnte jemand helfen.
Ich habe auf der Suche für ein - Lösung für Android - (API 7).
javax.xml
funktionieren nicht auf Android-API 7.Endete der Umsetzung dieser einfachen Klasse. Es umfasst nur die häufigste form der ISO-8601-strings, aber das sollte genug sein, in einigen Fällen (wenn du bist ganz sicher, dass die Eingabe in diese - format).
Leistung Hinweis: instanziieren ich neue " = SimpleDateFormat jedes mal, als Mittel zum vermeiden ein bug in Android 2.1. Wenn man so erstaunt wie ich war, sehen dieses Rätsel. Für andere Java-engines, kann der cache-Instanz in einem privaten, statischen Feld (mit ThreadLocal -, thread-safe).
InformationsquelleAutor der Antwort wrygiel
So, dass ist gesegnet von der Java 7 Dokumentation:
Finden Sie weitere Beispiele im Abschnitt Beispiele bei "=SimpleDateFormat javadoc.
InformationsquelleAutor der Antwort Antonio
java.Zeit
Den java.Zeit-API (built in Java 8 und höher), macht das ein wenig einfacher.
Wenn Sie wissen, der Eingang ist in UTCwie die
Z
(Zulu) am Ende, dieInstant
Klasse analysieren kann.Wenn Ihr input kann ein anderes offset von UTC Werte eher als UTC gekennzeichnet durch die
Z
(Zulu) am Ende, verwenden Sie dieOffsetDateTime
Klasse zu analysieren.Extrahieren Sie dann eine
Instant
und die Umstellung auf einejava.util.Date
durch den Aufruf.
InformationsquelleAutor der Antwort Adam
Den Jackson-databind-Bibliothek hat auch ISO8601DateFormat Klassedie das macht (die tatsächliche Durchführung ISO8601Utils.
InformationsquelleAutor der Antwort david_p
tl;dr
Mit java.Zeit
Den neuen java.Zeit - Paket in Java 8 und später wurde inspiriert von Joda-Time.
Den
OffsetDateTime
Klasse repräsentiert einen moment auf der Zeitachse mit einem offset von UTC aber nicht die Zeit-zone.Aufrufen
toString
erzeugt einen string im ISO 8601-standard-format:Zu sehen, den gleichen Wert durch die Linse von UTC, extrahieren Sie eine
Instant
oder passen Sie den offset von+01:00
zu00:00
....oder...
Passen in einen Zeit-zone, falls gewünscht. Ein Zeitzone ist eine Geschichte der offset von UTC Werte für eine region, mit einem Satz von Regeln für den Umgang mit Anomalien, wie Sommerzeit (DST). So wenden Sie ein Zeit-zone statt einer bloßen offset, Wann immer möglich.
Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte Vermächtnis Datum-Zeit-Klassen wie
java.util.Date
Calendar
&" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartungsmodusrät der migration auf die java.Zeit Klassen.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
Können Sie exchange java.Zeit Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber kompatibel mit JDBC 4.2 oder später. Keine Notwendigkeit für Streicher, keine Notwendigkeit für
java.sql.*
Klassen.Wo erhalten Sie die java.Zeit-Klassen?
Den ThreeTen-Extra Projekt erweitert die java.mal mit zusätzlicher Klassen. Dieses Projekt ist ein Testgelände für mögliche künftige Erweiterungen zu java.Zeit. Sie finden möglicherweise einige nützliche Klassen, die hier wie
Interval
YearWeek
YearQuarter
und mehr.InformationsquelleAutor der Antwort Basil Bourque
Zur Java-version 7
Können Sie Folgen Sie der Oracle-Dokumentation:
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X - ist für die ISO 8601 Zeitzone
InformationsquelleAutor der Antwort d.danailov
Den DatatypeConverter Lösung funktioniert nicht in allen VMs. Folgendes funktioniert bei mir:
Habe ich herausgefunden, dass joda nicht funktioniert out of the box (speziell für das Beispiel gab ich oben mit der Zeitzone, die auf ein Datum, das gültig sein sollte)
InformationsquelleAutor der Antwort James Scriven
Ich denke, wir sollten Sie nutzen
Datum
2010-01-01T12:00:00Z
InformationsquelleAutor der Antwort Toby
Andere sehr einfache Art und Weise zu analysieren, nach ISO8601 Zeitstempel ist die Nutzung
org.apache.commons.lang.time.DateUtils
:InformationsquelleAutor der Antwort tmandry
java.Zeit
Beachten Sie, dass in Java 8 verwenden, können Sie die java.Zeit.ZonedDateTime Klasse und Ihre statischen
parse(CharSequence text)
Methode.InformationsquelleAutor der Antwort Martin Rust
Stand ich vor der gleichen problem und löste es, indem Sie den folgenden code .
Früher war ich mit
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault());
Aber später fand ich, dass die wichtigste Ursache der Ausnahme war die
yyyy-MM-dd'T'HH:mm:ss.SSSZ
,So habe ich
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
Es funktionierte gut für mich .
InformationsquelleAutor der Antwort Abhay Kumar
Außerdem können Sie die folgenden Klasse -
Link, um die Java-Doc - Hierarchie Für den Paket-org.springframework.extensions.surf.maven.plugin.util
InformationsquelleAutor der Antwort Sergey Palyukh
Apache Jackrabbit verwendet den ISO-8601-format zum beibehalten von Daten, und es ist eine Hilfsklasse zum Parsen Ihnen:
org.apache.jackrabbit.util.Nach ISO8601
Kommt mit jackrabbit-jcr-commons.
InformationsquelleAutor der Antwort Alexander Klimetschek
Wie andere erwähnt haben Android nicht ein guter Weg, um support-Analyse/Formatierung ISO-8601-Datumsangaben mit Hilfe der Klassen im SDK enthalten ist. Ich habe geschrieben, dieser code mehrere Male, so dass ich schließlich erstellt eine Zusammenfassung, enthält eine Klasse DateUtils, unterstützt die Formatierung und Parsen von ISO-8601-und RFC 1123-Termine. Der Kern enthält auch einen Testfall, der zeigt, was es unterstützt.
https://gist.github.com/mraccola/702330625fad8eebe7d3
InformationsquelleAutor der Antwort Matt Accola
Den workaround für Java 7+ ist mit " = SimpleDateFormat:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);
Dieser code Parsen kann nach ISO8601-format wie:
2017-05-17T06:01:43.785Z
2017-05-13T02:58:21.391+01:00
Aber auf Java6,
SimpleDateFormat
nicht verstehenX
Charakter und wirftIllegalArgumentException: Unknown pattern character 'X'
Wir müssen zu normalisieren Datum nach ISO8601 format lesbar in Java 6 mit
SimpleDateFormat
.Oben genannte Methode zu ersetzen [
Z
mit+0000
] oder [+01:00
mit+0100
] wenn Fehler in Java 6 (Sie können ermitteln, Java-version und ersetzen Sie try/catch mit if-Anweisung).InformationsquelleAutor der Antwort Khang .NT
"=SimpleDateFormat für JAVA 1.7 hat ein cooles Muster für ISO-8601-format.
Klasse " = SimpleDateFormat
Hier ist was ich getan habe:
InformationsquelleAutor der Antwort Eesha
Java hat ein Dutzend verschiedene Möglichkeiten, um ein Datum zu analysieren-Zeit, der guten Antworten hier zeigen. Aber etwas erstaunlich, keine Java-Zeit-Klassen komplett implementieren ISO 8601!
Mit Java 8, die ich empfehlen würde:
Behandelt Beispiele, die beide in UTC und mit einem Versatz, wie "2017-09-13T10:36:40Z" oder "2017-09-13T10:36:40+01:00". Es wird für die meisten Anwendungsfälle.
Aber es wird nicht mit Beispielen wie "2017-09-13T10:36:40+01", die ist eine gültige ISO-8601-Datum-Zeit.
Es wird auch nicht behandeln, nur Datum, z.B. "2017-09-13".
Wenn Sie behandeln müssen, ich würde vorschlagen, mit einem regex ersten schnuppern der syntax.
Gibt es eine schöne Liste der ISO-8601-Beispiele hier mit vielen Sonderfällen: https://www.myintervals.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ ich bin mir nicht bewusst jede Java-Klasse, konnte mit Ihnen allen gerecht zu werden.
InformationsquelleAutor der Antwort Daniel Winterstein
Zeichenfolge verwenden, wie
LocalDate.parse(((String) data.get("d_iso8601")),DateTimeFormatter.ISO_DATE)
InformationsquelleAutor der Antwort Stepan
Hatte ich ein ähnliches Bedürfnis: ich musste in der Lage sein, zu analysieren, jedes Datum nach ISO8601-konform, ohne zu wissen, das genaue format im Voraus, und ich wollte eine leichte Lösung, die funktionieren auch auf Android.
Als ich gegoogelt meine Bedürfnisse stolperte ich über diese Frage, und bemerkt, dass AFAIU, keine Antwort ganz zu meinen Anforderungen passen. So entwickelte ich jISO8601 und schob es auf maven central.
Nur in Sie
pom.xml
:und dann sind Sie gut zu gehen:
Hofft, es hilft.
InformationsquelleAutor der Antwort gturri
Nur format ein Datum wie dieses die folgenden für mich gearbeitet in einer Java-6-basierte Anwendung. Es ist ein
DateFormat
KlasseJacksonThymeleafISO8601DateFormat
im thymeleaf Projekt fügt die fehlenden Doppelpunkt:https://github.com/thymeleaf/thymeleaf/blob/40d27f44df7b52eda47d1bc6f1b3012add6098b3/src/main/java/org/thymeleaf/standard/serializer/StandardJavaScriptSerializer.java
Ich benutzte es für ECMAScript-Datum-format-Kompatibilität.
InformationsquelleAutor der Antwort ekip
Machen Sie es wie diese:
Hier ist die Ausgabe:
Mi Okt 19 15:15:36 CST 2016
InformationsquelleAutor der Antwort David Yin
Basis-Funktion mit freundlicher Genehmigung : @wrygiel.
Diese Funktion kann konvertieren nach ISO8601-format auf Java-Datum, die mit der offset-Werte. Wie pro die - definition von ISO 8601 der offset kann erwähnt werden, dass in verschiedenen Formaten.
Diese Klasse besitzt statische Methoden zum konvertieren von
Probe nach ISO8601 Strings
}
InformationsquelleAutor der Antwort AKh
Diese schien zu funktionieren am besten für mich:
Ich brauchte, um zu konvertieren/fro JavaScript-date-strings in Java. Ich fand den oben genannten Werken mit der Empfehlung. Es wurden einige Beispiele für die Verwendung von " = SimpleDateFormat, die in der Nähe waren, aber Sie schien es nicht zu sein, die Teilmenge als empfohlen von:
http://www.w3.org/TR/NOTE-datetime
unterstützt von PLIST-und JavaScript-Strings und solche, die ist, was ich brauchte.
Scheint dies die häufigste form der nach ISO8601 string gibt, und eine gute Auswahl.
Die Beispiele, die Sie geben, sind:
Ich habe auch eine schnelle version:
...
Habe ich nicht gemessen, aber ich denke, es wird ziemlich schnell. Es scheint zu funktionieren. 🙂
InformationsquelleAutor der Antwort RickHigh
Ich denke, was viele Menschen wollen zu tun, ist der parse-JSON-Datum-strings. Es gibt eine gute chance, wenn Sie kommen zu dieser Seite, die Sie konvertieren möchten, eine JavaScript-JSON-date, Java date.
Zeigen, was ein JSON-Zeichenkette für das Datum sieht wie folgt aus:
JSON-Zeichenkette für das Datum ist 2013-12-14T01:55:33.412 Z.
Termine sind nicht abgedeckt durch JSON spec pro sagen, aber das oben genannte ist eine sehr spezifische ISO-8601-format, während ISO_8601 ist viel viel größer und das ist eine bloße Teilmenge, wenn auch ein sehr wichtiges.
Sehen http://www.json.org
Sehen http://en.wikipedia.org/wiki/ISO_8601
Sehen http://www.w3.org/TR/NOTE-datetime
Wie es passiert, ich schrieb einen JSON-parser und eine PLIST parser, die beide die Verwendung der ISO-8601-aber nicht die gleichen bits.
Schrieb ich zwei Möglichkeiten, dies zu tun für mein Projekt. Ein standard, eine schnelle.
Wieder, JSON-Zeichenkette für das Datum ist eine sehr spezifische Umsetzung der ISO 8601....
(Ich habe das andere in der anderen Antwort, die sollten für die PLIST-Daten, die eine andere ISO-8601-format).
JSON-Datum ist wie folgt:
PLIST-Dateien (ASCII nicht GNUNext) verwendet ISO-8601-aber keine Millisekunden, also... nicht alle ISO-8601-Termine sind die gleichen. (Zumindest habe ich keinen gefunden, verwendet milis noch und der parser habe ich gesehen, überspringen Sie die Zeitzone insgesamt OMG).
Nun für die schnelle version (Sie finden es in Segen).
Beachten Sie, dass Reflexion.toCharArray nutzt unsicher, wenn verfügbar, aber standardmäßig string.toCharArray wenn nicht.
(Sie können es aus dem Beispiel durch Austausch und Reflexion.toCharArray ( string ) string.toCharArray()).
Den isJsonDate ist wie folgt implementiert:
Sowieso... meine Vermutung ist, dass durchaus ein paar Leute, die hierher kommen,.. vielleicht suchen, für die JSON-Zeichenkette für das Datum und zwar ist es ein ISO-8601-Datum, es ist sehr spezifisch, die Bedürfnisse einer sehr speziellen analysieren.
Sehen https://github.com/RichardHightower/boon
Boon hat einen PLIST parser (ASCII) und einen JSON-parser.
Den JSON-parser ist die Schnellste Java-JSON-parser, den ich kenne.
Unabhängig verifiziert von der Gatling-Leistung dudes.
https://github.com/gatling/json-parsers-benchmark
Dass Sie die Schnellste JSON-parser für streams, Leser, Byte[], char[], CharSequence (StringBuilder, CharacterBuffer) und String.
Sehen mehr benchmarks an:
https://github.com/RichardHightower/json-parsers-benchmark
InformationsquelleAutor der Antwort RickHigh