Osobiście uważam, że komunikat o błędzie „Pole nieobsługiwany: Year” mylące. Prawdziwą przyczyną jest brak strefy czasowej. Ta informacja jest potrzebna, aby pomóc formaterowi w wewnętrznym przekształceniu danej chwili w reprezentację czasu ludzkiego. Rozwiązanie: Podaj strefę czasową. Następnie obsługiwane jest formatowanie lub parsowanie Instant
- w przeciwieństwie do odpowiedzi @flo.
Druk:
String s =
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.format(Instant.now());
System.out.println(s); // 2015-Oct-30 15:22:32
analizowaniem:
Odwrotna procedura - parsowania - czy niestety nie działają w ten sam bezpośredni sposób, ponieważ silnik format java.time
jest zaprojektowany tak, że formater tylko zwraca surowy TemporalAccessor
, który należy przekonwertować na wymagany wymagany typ. Przykład:
Instant instant =
Instant.from(
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.parse("2015-Oct-30 15:22:32"));
System.out.println("=>" + instant); // 2015-10-30T14:22:32Z
Jeżeli sygnał wejściowy jest analizowany zawiera strefy czasowej lub identyfikator, a następnie można modyfikować wzór (symboli X, X, Z, Z, VV itd.) I pozostawić na wywołanie withZone(...)
, aw przypadku przesunięć - naprawdę powinieneś pominąć to wezwanie, ponieważ w przeciwnym razie formater nie użyje przesunięcia strefy czasowej twojego wejścia, ale dostarczonej jednej strefy (pułapka, którą zaobserwowałem we własnych testach).
czy miałeś na myśli 'yyyy' zamiast' uuuu' – Kal
@Kal Próbowałem obu. 'yyyy' po prostu rzuca' Unsupported field: Year of Era' zamiast 'Unsupported field: Year'. – Museful
Czy wypróbowałeś 'toMillis' zamiast' toInstant'?Formatowanie 'Instant' wymaga strefy czasowej. – Kal