Ich versuche, eine ISO 8601 formatierte Zeichenkette in eine java.util.Date
.
Ich habe das Muster gefunden yyyy-MM-dd'T'HH:mm:ssZ
ISO8601-konform zu sein, wenn sie mit einem Gebietsschema verwendet wird (siehe Beispiel).
Allerdings ist die Verwendung der java.text.SimpleDateFormat
kann ich den korrekt formatierten String nicht umwandeln 2010-01-01T12:00:00+01:00
. Ich muss es zunächst in 2010-01-01T12:00:00+0100
, ohne den Doppelpunkt.
Die derzeitige Lösung lautet also
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));
was natürlich nicht so schön ist. Übersehe ich etwas oder gibt es eine bessere Lösung?
Antwort
Dank des Kommentars von JuanZe habe ich die Joda-Time Magie, sie ist auch hier beschrieben .
Die Lösung lautet also
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));
Oder einfacher: Verwenden Sie den Standard-Parser über den Konstruktor:
DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;
Für mich ist das schön.
283 Stimmen
Seien Sie darauf gefasst, dass Sie eine Menge "Use JodaTime"-Antworten erhalten werden...
3 Stimmen
@Ice09: Wenn die API-Dokumentation für DateTimeFormat korrekt ist (die JoDa-Dokumentation kann allerdings irreführend, falsch oder unvollständig sein), ist das Muster, das Sie in Ihrer eigenen "Antwort" verwendet haben, nicht mit ISO8601 kompatibel.
0 Stimmen
@jarnbjo: Danke für den Kommentar - du könntest Recht haben, ich habe noch einmal nachgeschaut und bin auf die viel bessere Lösung ISODateTimeFormat.dateTimeNoMillis() gekommen, die irgendwie garantiert, dass das richtige Format verwendet wird.
0 Stimmen
Siehe: stackoverflow.com/questions/1554852/ と stackoverflow.com/questions/2580925/simpledateformat-parsing と stackoverflow.com/questions/4013681/ und
24 Stimmen
Ich bin nicht sicher, wann dies hinzugefügt wurde, aber das "X" scheint dieses Problem in SimpleDateFormat zu lösen. Das Muster "yyyy-MM-dd'T'HH:mm:ssX" parst erfolgreich das Beispiel in der Frage.
13 Stimmen
Das 'X' ist seit Java 7 verfügbar.
0 Stimmen
Apache Jackrabbit verwendet das Format ISO 8601 für die Speicherung von Datumsangaben, und es gibt eine Hilfsklasse, um sie zu parsen: org.apache.jackrabbit.util.ISO8601 Kommt mit jackrabbit-jcr-commons .
1 Stimmen
Die eingebettete Antwort mit Joda-Time kann viel kürzer sein, eine einzige Codezeile, ohne die Parse-Methode aufrufen zu müssen:
new DateTime( "2010-01-01T12:00:00+01:00" )
. Siehe meine Antwort für Details.0 Stimmen
Ich habe eine Antwort gefunden, die mir bei [dieser speziellen Antwort][1] geholfen hat. [1]: stackoverflow.com/a/10615059/2413303
4 Stimmen
Java 8 macht es einfach! In den Antworten unten hat Adam ein Juwel versteckt: stackoverflow.com/a/27479533/1262901
0 Stimmen
Joda DateTime unterstützte nicht 20190531T194819Z(yyyyMMdd'T'HHmmssSSS'Z') Beispiel aus de.wikipedia.org/wiki/ISO_8601 und fügte daher die nachstehende Lösung hinzu: stackoverflow.com/questions/2201925/