Verwenden Sie den Großbuchstaben X anstelle von x, also XXX. Der Unterschied besteht darin, dass das große X den Eingangsbuchstaben "Z" als UTC-Offset +00: 00 erkennen kann, während der kleine Musterbuchstabe X dies nicht kann.
Vorgeschlagene Muster:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
Bitte beachten Sie auch folgende JDK-bug:
java.time.format.DateTimeFormatter kann ein nicht analysieren Offset mit einzelnen digit Stunde
UPDATE:
Ich habe jetzt die beschriebene Problemumgehung im Bug-Log getestet.
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
Aber es gibt eine Ausnahme aus:
Exception in thread "main" java.time.format.DateTimeParseException: Text ‚2014-05-02-10.45.05.993280-5: 00 'konnte nicht bei Index 26 bei java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) bei java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) bei HelloWorld.main geparst werden (Hallo Welt.java: 16)
So mildes Parsing hilft auch nicht. So gibt es jetzt nur noch drei Optionen, die für Sie:
Verwenden Abhilfe durch Bug Reporter vorgeschlagen: [...] Abhilfe ist, das Datum/Zeit getrennt zu analysieren, eine Hand codiert Parser für den Offset verwenden und kombinieren Sie LocalDateTime mit dem von Hand geparsten Offset. Keine leichte Aufgabe.
Versuchen Sie Ihre eigene spezialisierte String-Vorverarbeitung. Wenn Sie ein festes Format haben, können Sie versuchen, die Nullstelle an Position 26 einzufügen (wenn die Gesamteingabedauer eine Ziffer zu klein ist).
Oder Sie verwenden eine externe Bibliothek, die dies tun kann. Meine Bibliothek Time4J (v4.0) kann das tun, wenn Sie bereit sind, eine zusätzliche Abhängigkeit hinzuzufügen. Sehen Sie diesen Code:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
Update: Laut JDK-bug-Status hat sich der Fehler für Java-9 behoben worden, aber ein Backport für Java-8 scheint nicht zu sein verfügbar obwohl.
Welche Java-Version verwenden Sie? –
@JonSkeet - Entschuldigung, aktualisiert ursprünglichen Beitrag. – Cheetah