Форматировать мгновенный в строку
Я пытаюсь отформатировать мгновение в строку, используя новый java 8 time-api и шаблон:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
используя приведенный выше код я получаю исключение, которое жалуется на неподдерживаемый поле:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
at java.time.Instant.getLong(Instant.java:608)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
...
4 ответа:
Часовой Пояс
в формате
Instant
a часовой пояс это. Без часового пояса модуль форматирования не знает, как преобразовать мгновение в человеческие поля даты и времени, и поэтому создает исключение.часовой пояс можно добавить непосредственно в форматер с помощью
withZone()
.DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ) .withLocale( Locale.UK ) .withZone( ZoneId.systemDefault() );
Генерировать Строку
теперь использовать это средство форматирования, чтобы создавать строковое представление ваших Мгновенный.
Instant instant = Instant.now(); String output = formatter.format( instant );
дамп в консоли.
System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() ); System.out.println("instant: " + instant ); System.out.println("output: " + output );
при запуске.
formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB instant: 2015-06-02T21:34:33.616Z output: 02/06/15 14:34
The
Instant
класс не содержит информацию о Зоне, он хранит только метку времени в миллисекундах от эпохи UNIX, т. е. 1 Jan 1070 от UTC. Таким образом, форматер не может печатать дату, потому что дата всегда печатается для конкретного часового пояса. Вы должны установить часовой пояс для форматирования и все будет хорошо, как это :Instant instant = Instant.ofEpochMilli(92554380000L); DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC); assert formatter.format(instant).equals("07/12/72 05:33"); assert instant.toString().equals("1972-12-07T05:33:00Z");