Należy użyć dużej litery X zamiast x, stąd XXX. Różnica polega na tym, że duże X może rozpoznać literę wejściową "Z" jako przesunięcie UTC +00: 00, podczas gdy mała litera X nie może.
Sugerowane wzór:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
Należy również pamiętać o następujących JDK-bug:
java.time.format.DateTimeFormatter nie można analizować offset z pojedynczym cyfrowym godzinę
AKTUALIZACJA:
Przetestowałem opisane obejście w dzienniku błędów.
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));
Ale to zgłasza wyjątek:
Wyjątek w wątku "głównym" java.time.format.DateTimeParseException: Tekst „2014-05-02-10.45.05.993280-5: 00 'nie mógł być przeanalizowany w indeksie 26 w java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) w java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) at HelloWorld.main (Witaj świecie.java: 16)
Tak łagodne parsowanie też nie pomaga. więc istnieje teraz tylko trzy opcje w lewo dla Ciebie:
Zastosowanie obejście sugerowane przez bug reporter: [...] Rozwiązaniem jest do analizowania datę/czas osobno, należy korzystać z zakodowaną parser dla offsetu i połączyć LocalDateTime z przesunięciem ręcznym. Nie jest to łatwa praca.
Wypróbuj własny specjalistyczny przerób struny. Jeśli masz stały format, możesz spróbować wstawić cyfrę zero w pozycji 26 (jeśli całkowita długość wejściowa jest o jedną cyfrę zbyt mała).
Albo używasz zewnętrznej biblioteki, która może to zrobić. Moja biblioteka Time4J (v4.0) może to zrobić, jeśli chcesz dodać dodatkową zależność. Zobacz ten kod:
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();
Aktualizacja: Zgodnie z JDK-bug-statusu, błąd został naprawiony Java-9, ale backportu Java-8 nie wydaje się być dostępne jednak.
Z której wersji Java korzystasz? –
@JonSkeet - przepraszam, zaktualizowany oryginalny wpis. – Cheetah