Перейти к основному содержимому

Форматировать ZonedDateTime в строку

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы увидим, как преобразовать ZonedDateTime в строку.

Мы также рассмотрим, как анализировать ZonedDateTime из строки.

2. Создание ZonedDateTime

Во- первых, мы начнем с ZonedDateTime с часовым поясом UTC. Есть несколько способов сделать это.

Мы можем указать год, месяц, день и т. д.:

ZonedDateTime zonedDateTimeOf = ZonedDateTime.of(2018, 01, 01, 0, 0, 0, 0, ZoneId.of("UTC"));

Мы также можем создать ZonedDateTime из текущей даты и времени:

ZonedDateTime zonedDateTimeNow = ZonedDateTime.now(ZoneId.of("UTC"));

Или мы можем создать ZonedDateTime из существующего LocalDateTime :

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));

3. ZonedDateTime в строку

Теперь давайте преобразуем наш ZonedDateTime в строку. Для этого мы будем использовать класс DateTimeFormatter .

Есть несколько специальных средств форматирования, которые мы можем использовать для отображения данных часового пояса. Полный список форматировщиков можно найти здесь , но мы рассмотрим несколько наиболее распространенных.

Если мы хотим отобразить смещение часового пояса, мы можем использовать средство форматирования «Z» или «X» :

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss Z");
String formattedString = zonedDateTime.format(formatter);

Это даст нам такой результат:

02/01/2018 - 13:45:30 +0000

Чтобы включить имя часового пояса, мы можем использовать строчную букву «z»:

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss z");
String formattedString2 = zonedDateTime.format(formatter2);

Результатом этого будет:

02/01/2018 - 13:45:30 UTC

4. Строка для ZonedDateTime

Этот процесс может работать и в обратном направлении. Мы можем взять строку и преобразовать ее обратно в ZonedDateTime .

Один из вариантов сделать это — использовать статический метод parse() класса ZonedDateTime :

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2011-12-03T10:15:30+01:00");

Этот метод использует средство форматирования ISO_ZONED_DATE_TIME . Существует также перегруженная версия метода, принимающая параметр DateTimeFormatter . Однако строка должна содержать идентификатор зоны, иначе мы получим исключение:

assertThrows(DateTimeParseException.class, () -> 
ZonedDateTime.parse("2011-12-03T10:15:30", DateTimeFormatter.ISO_DATE_TIME));

Второй вариант получения ZonedDateTime из строки включает 2 шага: преобразование строки в LocalDateTime, затем этот объект в ZonedDateTime:

ZoneId timeZone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = LocalDateTime.parse("2011-12-03T10:15:30",
DateTimeFormatter.ISO_DATE_TIME).atZone(timeZone);

log.info(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

Этот косвенный метод просто объединяет дату и время с идентификатором зоны:

INFO: 2011-12-03T10:15:30+02:00[Europe/Athens]

Чтобы узнать больше о синтаксическом анализе String на даты, ознакомьтесь с нашей более подробной статьей о синтаксическом анализе дат .

5. Вывод

В этой статье мы увидели, как создать ZonedDateTime и как отформатировать его как строку.

Мы также кратко рассмотрели, как анализировать строку даты и времени и преобразовывать ее в ZonedDateTime .

Исходный код этого руководства доступен на Github .