Лично аз намирам съобщението за грешка „Неподдържано поле: Година“ за подвеждащо. Истинската причина е липсата на часова зона. Тази информация е необходима, за да помогне на форматиращия вътрешно да преобразува дадения момент в представяне на човешко време. Решение: Въведете часовата зона. След това форматирането или анализирането на Instant
се поддържа - за разлика от отговора на @flo.
Печат:
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
Синтактичен анализ:
Обратната процедура - парсирането - за съжаление не работи по същия директен начин, тъй като машината за форматиране на java.time
е проектирана така, че форматиращият връща само необработен TemporalAccessor
, който трябва да бъде преобразуван в реалния изискван тип. Пример:
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
Ако входът, който трябва да бъде анализиран, съдържа отместване на часовата зона или идентификатор, тогава можете да промените модела (символи x, X, z, Z, VV и т.н.) и да оставите извикването на withZone(...)
, а в случай на отмествания - наистина трябва пропуснете това извикване, защото в противен случай форматиращият няма да използва отместването на часовата зона на вашия вход, а предоставената една зона (клопка, която наблюдавах в собствените си тестове).
person
Meno Hochschild
schedule
30.10.2015
yyyy
вместоuuuu
- person Kal   schedule 30.10.2015yyyy
просто хвърляUnsupported field: Year of Era
вместоUnsupported field: Year
. - person Museful   schedule 30.10.2015toMillis
вместоtoInstant
? Форматирането наInstant
изисква часова зона. - person Kal   schedule 30.10.2015toMillis
? - person Museful   schedule 30.10.2015