«1. Введение
В нашем мире каждая страна следует определенному часовому поясу. Эти часовые пояса имеют решающее значение для удобного и эффективного отображения времени. Однако часовые пояса иногда могут быть неясными из-за таких переменных, как переход на летнее время.
Кроме того, представление этих часовых поясов в нашем коде может привести к путанице. В прошлом Java предоставляла несколько классов, таких как Date, Time и DateTime, которые также заботятся о часовых поясах.
Однако в новых версиях Java появились более полезные и выразительные классы, такие как ZoneId и ZoneOffset, для управления часовыми поясами.
В этой статье мы обсудим ZoneId и ZoneOffset, а также связанные с ними классы DateTime.
Мы также можем прочитать о новом наборе классов DateTime, представленных в Java 8, в нашем предыдущем посте.
2. ZoneId и ZoneOffset
С появлением JSR-310 были добавлены некоторые полезные API для управления датой, временем и часовыми поясами. В рамках этого обновления также были добавлены классы ZoneId и ZoneOffset.
2.1. ZoneId
Как указано выше, ZoneId представляет часовой пояс, такой как «Европа/Париж».
Есть 2 реализации ZoneId. Во-первых, с фиксированным смещением относительно GMT/UTC. А во-вторых, как географический регион, в котором есть набор правил для расчета смещения относительно GMT/UTC.
Давайте создадим ZoneId для Берлина, Германия:
ZoneId zone = ZoneId.of("Europe/Berlin");
2.2. ZoneOffset
ZoneOffset расширяет ZoneId и определяет фиксированное смещение текущего часового пояса с GMT/UTC, например +02:00.
Это означает, что это число представляет фиксированные часы и минуты, представляющие собой разницу между временем в текущем часовом поясе и временем по Гринвичу/UTC: Зимой для одного и того же региона будет две разные реализации ZoneOffset, поэтому необходимо указать LocalDateTime.
LocalDateTime now = LocalDateTime.now();
ZoneId zone = ZoneId.of("Europe/Berlin");
ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
3. Классы DateTime
Далее давайте обсудим некоторые классы DateTime, которые на самом деле используют преимущества ZoneId и ZoneOffset.
3.1. ZonedDateTime
ZonedDateTime — это неизменное представление даты и времени с часовым поясом в календарной системе ISO-8601, например 2007-12-03T10:15:30+01:00 Europe/Paris. ZonedDateTime содержит состояние, эквивалентное трем отдельным объектам: LocalDateTime, ZoneId и разрешенному ZoneOffset.
Этот класс хранит все поля даты и времени с точностью до наносекунд и часовой пояс с ZoneOffset для обработки неоднозначных локальных дат и времени. Например, ZonedDateTime может хранить значение «2 октября 2007 г., 13:45.30.123456789 +02:00 в часовом поясе Европа/Париж».
Давайте получим текущую ZonedDateTime для предыдущего региона:
ZonedDateTime также предоставляет встроенные функции для преобразования заданной даты из одного часового пояса в другой:
ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime date = ZonedDateTime.now(zone);
3.2. OffsetDateTime
ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);
OffsetDateTime — это неизменное представление даты и времени со смещением в календарной системе ISO-8601, например 2007-12-03T10:15:30+01:00.
Этот класс хранит все поля даты и времени с точностью до наносекунд, а также смещение от GMT/UTC. Например, OffsetDateTime может хранить значение «2 октября 2007 г., 13:45.30.123456789 +02:00».
Получим текущее время OffsetDateTime со смещением на 2 часа от GMT/UTC:
3.3. OffsetTime
ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime date = OffsetDateTime.now(zoneOffSet);
OffsetTime — это неизменяемый объект даты и времени, который представляет время, часто рассматриваемое как смещение час-минута-секунда в календарной системе ISO-8601, например 10:15:30+01:00.
Этот класс хранит все поля времени с точностью до наносекунд, а также смещение зоны. Например, OffsetTime может хранить значение «13:45.30.123456789+02:00».
Давайте получим currentOffsetTime со смещением на 2 часа:
4. Заключение
ZoneOffset zoneOffSet = ZoneOffset.of("+02:00");
OffsetTime time = OffsetTime.now(zoneOffSet);
Возвращаясь к фокусу, ZoneOffset представляет часовой пояс с точки зрения разницы между GMT/UTC и данное время. Это удобный способ представления часового пояса, хотя доступны и другие представления.
«Более того, ZoneId и ZoneOffset используются не только независимо, но и некоторыми классами Java DateTime, такими как ZonedDateTime, OffsetDateTime и OffsetTime.
Как обычно, код доступен в нашем репозитории GitHub.
«