Лично я нахожу сообщение об ошибке «неподдерживаемый поле: Год» вводит в заблуждение. Реальная причина отсутствует часовой пояс. Эта информация необходима, чтобы помочь форматировщику внутренне преобразовать данный момент в представление времени человека. Решение: поставьте часовой пояс. Поддерживается форматирование или разбор 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, В. В. и др) и оставить из призыв к withZone(...)
, и в случае смещения - вы действительно должны отказаться от этого вызова, потому что в противном случае форматировщик не будет использовать смещение часового пояса вашего входа, кроме предоставленной одной зоны (я обнаружил ошибку в своих тестах).
Вы имели в виду 'yyyy' вместо' uuuu' – Kal
@Kal Я пробовал оба. 'yyyy' просто бросает' Неподдерживаемое поле: Год эры' вместо 'Неподдерживаемого поля: Год'. – Museful
Вы попробовали 'toMillis' вместо' toInstant'?Для форматирования 'Instant' требуется часовой пояс. – Kal