Лично я считаю сообщение об ошибке «Неподдерживаемое поле: год» вводящим в заблуждение. Настоящая причина — отсутствие часового пояса. Эта информация необходима, чтобы помочь программе форматирования внутренне преобразовать данный момент времени в человеческое представление времени. Решение: укажите часовой пояс. Тогда поддерживается форматирование или разбор 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