«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.

«