Перейти к основному содержимому

ZoneOffset в Java

· 4 мин. чтения

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 .