Dlaczego wydaje się, że biblioteka JDK8 DateTime nie analizuje ważnych ciągów znaków daty iso8601? To dławiki na przesunięcia strefy czasowej wyrażone jak "+01" zamiast "+01: 00"java.time.ZonedDateTime.parse i iso8601?
To działa:
java.time.ZonedDateTime.parse("2015-08-18T00:00+01:00")
ta rzuca wyjątek składniowy:
java.time.ZonedDateTime.parse("2015-08-18T00:00+01")
od ISO8601 Strona wikipedia:
Przesunięcie od czasu UTC jest dołączane do czasu w taki sam sposób, jak "Z" znajdowało się wyżej w rm ± [hh]: [mm], ± [gg] [mm] lub ± [gg]. Jeśli więc opisywany czas to 1 godzina przed czasem UTC (np. W Berlinie w okresie zimowym), oznaczenie strefy będzie wynosić "+01: 00", "+0100" lub po prostu "+01" .
EDIT: Wygląda to na prawdziwy uzasadniony błąd w JDK.
https://bugs.openjdk.java.net/browse/JDK-8032051
Wow, po przetestowaniu tej nowej Data Godzina rzeczy przez lata, myślałem, że złapałem coś tak oczywistego. Sądziłem również, że typy autorów JDK są na tyle rygorystyczne, że używają lepiej zautomatyzowanego zestawu testów.
AKTUALIZACJA: Jest to całkowicie poprawione w aktualnej kompilacji jdk-9. Właśnie potwierdziłem. Dokładnie to samo polecenie parse pokazane powyżej zawodzi w aktualnej kompilacji jdk-8 i działa doskonale w jdk-9.
ADDENDUM: FWIW, RFC 3339 oparty na ISO-8601, nie dopuszcza tego krótkiego układu. Musisz określić minuty w przesunięciach strefy czasowej.
Pytanie brzmi: ...? (to znaczy, może chcieć zmienić tytuł - zakładam, że chciałbyś wiedzieć, dlaczego, a może jak wykonać tę pracę). – StaxMan
Strefy czasowe są o wiele bardziej skomplikowane niż tylko przesunięcie. Możesz być bezpieczny w tej sytuacji, ale ogólnie myślenie o strefach czasowych pod względem przesunięć jest praktyką, której należy unikać. – Necreaux
@StaxMan, wyjaśnione dokładne pytanie ... Myślałem, że to oczywiste. – clay