Perché non si riesce a eseguire quanto segue, con la stringa data/ora in grado di analizzare come OffsetDateTime
?Perché `GMT + 8` non riesce ad analizzare con il pattern` O` nonostante sia stato copiato direttamente da doc?
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);
Utilizzando Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
su Mac OS X El Capitan 10.11.4.
genera l'errore:
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
Il offset-from-UTC stringa GMT+8
viene copiata-incollata dall'esempio nella documentazione classe per DateTimeFormatter
. Per citare:
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'.
Il resto della stringa analizza con successo come LocalDateTime
. Quindi il problema sembra essere la parte offset-da-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
Soluzione
Una soluzione parziale è quello di aggiungere uno spazio finale sia alla stringa di input e lo schema di formattazione. Quindi questo funziona.
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
Ma l'aggiunta di minuti senza i due punti è documentato come lavorare con un unico O
ma fallisce. Questa soluzione alternativa di uno SPACE finale non è di aiuto in questo caso. Notare GMT+0800
in questo esempio rispetto a GMT+08
visto direttamente sopra, dove questo esempio fallisce ma quello sopra ha esito positivo.
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
Il fatto che questo è un 'StringIndexOutOfBoundsException' mi fa pensare che questo è un bug –
@SotiriosDelimanolis avete capito bene:.. Https: // bugs. openjdk.java.net/browse/JDK-8154050 – Andreas
Sembra che una soluzione alternativa sia quella di aggiungere uno spazio sia alla stringa di formato sia al testo. –