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