Dlaczego następujące czynności nie działają, a ciąg daty i czasu nie może zostać przeanalizowany jako OffsetDateTime
?Dlaczego `GMT + 8` nie parsuje ze wzorcem` O` mimo skopiowania z dokumentu?
String inputOdt = "2016-01-23T12:34:56 GMT+8";
DateTimeFormatter formatterOdt = DateTimeFormatter.ofPattern ("yyyy-MM-dd'T'HH:mm:ss O");
OffsetDateTime odt = OffsetDateTime.parse (inputOdt , formatterOdt);
Korzystanie Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
na Mac OS X El Capitan 10.11.4.
Generuje błąd:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2016-01-23T12:34:56 GMT+8' could not be parsed: String index out of range: 25
offset-from-UTC ciąg GMT+8
kopiowany jest wklejony z przykładu w dokumentacji klasy dla DateTimeFormatter
. Zacytować:
Offset O: This formats the localized offset based on the number of pattern letters. One letter outputs the short form of the localized offset, which is localized offset text, such as 'GMT', with hour without leading zero, optional 2-digit minute and second if non-zero, and colon, for example 'GMT+8'.
Reszta napisu analizuje powodzeniem jako LocalDateTime
. Tak więc problem wydaje się być częścią offset-from-UTC.
String inputLdt = "2016-01-23T12:34:56";
DateTimeFormatter formatterLdt = DateTimeFormatter.ofPattern ("yyyy-MM-dd'T'HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse (inputLdt , formatterLdt);
System.out.println ("");
System.out.println ("inputLdt: " + inputLdt);
System.out.println ("ldt: " + ldt);
inputLdt: 2016-01-23T12:34:56
ldt: 2016-01-23T12:34:56
Obejście
Częściowym rozwiązaniem jest dodanie spacją zarówno ciągu wejściowego i wzorca formatowania. To działa.
String input = "Sat May 02 2015 00:00:00 GMT+08 "; // Trailing space.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("EEE MMM dd yyyy HH:mm:ss O "); // Trailing space.
OffsetDateTime odt = OffsetDateTime.parse (input , formatter); // SUCCEEDS
Ale dodanie minut bez dwukropka jest udokumentowane jak pracować z jednym O
ale to się nie powiedzie. To obejście problemu SPACE nie pomaga w takim przypadku. Zwróć uwagę na GMT+0800
w tym przykładzie w porównaniu z GMT+08
widzianą bezpośrednio powyżej, gdzie ten przykład kończy się niepowodzeniem, ale powyższy kod się powiódł.
String input = "Sat May 02 2015 00:00:00 GMT+0800 "; // Minutes in the offset, and trailing space.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("EEE MMM dd yyyy HH:mm:ss O "); // Trailing space.
OffsetDateTime odt = OffsetDateTime.parse (input , formatter); // FAILS
fakt, że jest to 'StringIndexOutOfBoundsException' sprawia mi, że to jest bug –
@SotiriosDelimanolis masz go.. Https: // bugs. openjdk.java.net/browse/JDK-8154050 – Andreas
Wygląda na obejście problemu: dołączanie spacji zarówno do ciągu formatowania, jak i tekstu do analizy. –