Узнайте о классе ZonedDateTime в Java, о том, как создавать его экземпляры и других вариантах использования, таких как синтаксический анализ, форматирование и добавление длительности и периодов.
1. Обзор
Класс java.time.ZonedDateTime, представленный в API даты и времени Java 8, представляет дату и время с идентификатором зоны и информацией о смещении зоны в календарной системе ISO-8601. Этот класс хранит все поля даты и времени с точностью до наносекунд.
Экземпляр ZonedDateTime может использоваться для преобразования экземпляра в универсальной временной шкале в LocalDateTime, где разница представляет собой смещение часового пояса, а смещение вычисляется на основе правил часового пояса. Обратите внимание, что идентификатор часового пояса может иметь различные смещения в течение года, когда переключается летнее время(DST). В таких случаях ZonedDateTime всегда имеет текущее смещение для этого пояса
Мы можем использовать экземпляры ZonedDateTime, где нам нужно представить время для глобально распределенных пользователей. Например, мы можем использовать его для сообщения даты конференции, где участники будут подключаться онлайн на основе их локальной даты и времени.
ZonedDateTime хранит состояние, эквивалентное трем отдельным объектам: LocalDateTime, ZoneId и разрешенному ZoneOffset.
Экземпляры ZonedDateTime неизменяемы и потокобезопасны. Класс определен следующим образом:
public final class ZonedDateTimeextends Objectimplements Temporal, ChronoZonedDateTime<LocalDate>, Serializable{//class body}
2. Создание ZonedDateTime
Как правило, мы будем создавать экземпляры ZonedDateTime в двух условиях, а именно: получить текущую временную метку или создать временную метку в определенном идентификаторе часового пояса и смещении.
2.1. Получить текущую временную метку
Используйте метод now() для получения текущей временной метки с текущим идентификатором зоны и смещением. Чтобы получить тот же экземпляр в другом часовом поясе, передайте идентификатор зоны в метод now().
ZonedDateTime now = ZonedDateTime.now();ZonedDateTime now = ZonedDateTime.now( ZoneId.of("GMT+05:30") );
2.2. Создать ZonedDateTime со значениями
Чтобы создать временную метку с указанной датой, временем и поясной информацией, используйте метод of(), который принимает различные аргументы для формирования экземпляра.
ZoneId zoneId = ZoneId.of("UTC+1");ZonedDateTime zdt = ZonedDateTime.of(2015, 11, 30, 23, 45, 59, 1234, zoneId);//Create from other local instancesLocalDate localDate = LocalDate.of(2019, 03, 12);LocalTime localTime = LocalTime.of(12, 44);ZoneId zoneId = ZoneId.of("GMT+05:30");ZonedDateTime timeStamp = ZonedDateTime.of( localDate, localTime, zoneId );
3. Разбор строки в ZonedDateTime
Класс ZonedDateTime имеет два перегруженных метода parse() для преобразования строки в экземпляр ZonedDateTime.
parse(CharSequence text) //1parse(CharSequence text, DateTimeFormatter formatter) //2
- Используйте первый метод, если строка содержит время в шаблоне ISO_ZONED_DATE_TIME, например, 2019-03-28T10:15:30+01:00[Европа/Париж]. Это шаблон по умолчанию.
- Для любого другого шаблона даты и времени нам нужно использовать второй метод, в котором мы передаем дату и время как строку, а также DateTimeFormatter, который представляет шаблон этой строки даты и времени.
//1 - default patternString timeStamp = "2019-03-27T10:15:30";ZonedDateTime localTimeObj = ZonedDateTime.parse(time);//2 - specified patternDateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a");String timeStamp1 = "2019-03-27 10:15:30 AM";ZonedDateTime localTimeObj1 = ZonedDateTime.parse(timeStamp1, formatter);
4. Формат ZonedDateTime
Используйте метод ZonedDateTime.format(formatter) для форматирования экземпляра в соответствии с желаемым шаблоном строки.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a");ZonedDateTime now = ZonedDateTime.now();String dateTimeString = now.format(formatter); //2019-03-28 14:47:33 PM
5. Добавьте или вычтите время из ZonedDateTime
ZonedDateTime предоставляет следующие методы для модификации. Все методы возвращают новый экземпляр ZonedDateTime, поскольку существующий экземпляр всегда неизменяем.
- plusГоды()
- plusМесяцы()
- plusDays()
- plusHours()
- плюсМинуты()
- plusSeconds()
- plusNanos()
- минусГоды()
- минусМесяцы()
- minusDays()
- минусЧасы()
- minusMinutes()
- минусСекунды()
- минусНанос()
ZonedDateTime now = ZonedDateTime.now();//3 hours laterZonedDateTime zonedDateTime1 = now.plusHours(3);//3 minutes earliarZonedDateTime zonedDateTime2 = now.minusMinutes(3);//Next year same timeZonedDateTime zonedDateTime2 = now.plusYears(1);//Last year same timeZonedDateTime zonedDateTime2 = now.minusYears(1);
6. Еще примеры
- Форматировать ZonedDateTime в строку
- Разбор строки в ZonedDateTime
- Преобразование LocalDate в ZonedDateTime в Java
- Пример преобразования часового пояса ZonedDateTime
- Сравнение экземпляров ZonedDateTime
- Java 8 – Анализ строки в дату-время в формате UTC