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 .