Рубрики
Без рубрики

Смещение зоны в Java

Краткое руководство по работе со смещением зоны и ZoneId в Java.

Автор оригинала: baeldung.

1. введение

В нашем мире каждая страна придерживается определенного часового пояса. Эти часовые пояса имеют решающее значение для удобного и эффективного выражения времени. Однако часовые пояса иногда могут быть необъяснимыми из-за таких переменных, как переход на летнее время.

Более того, при представлении этих часовых поясов в нашем коде все может запутаться. В прошлом Java предоставляла несколько классов, таких как Date , Time и DateTime , чтобы также заботиться о часовых поясах.

Однако в новых версиях Java появились более полезные и выразительные классы, такие как Zones и Zone Offset , для управления часовыми поясами.

В этой статье мы обсудим ZoneId и ZoneOffset , а также связанные Дата и время классы .

Мы также можем прочитать о новом наборе классов 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

Смещение зоны расширяет ZoneId и определяет фиксированное смещение текущего часового пояса с GMT/UTC , например +02:00.

Это означает, что это число представляет собой фиксированные часы и минуты, представляющие разницу между временем в текущем часовом поясе и GMT/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

ZonedDateTime -это неизменяемое представление даты-времени с часовым поясом в календарной системе ISO-8601, например 2007-12-03T10:15:30+01:00 Europe/Pari s. |/A ZonedDateTime содержит состояние, эквивалентное трем отдельным объектам: a LocalDateTime , a ZoneId и разрешенный 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. Время смещения

Смещение времени -это неизменяемый объект даты-времени, который представляет время, часто рассматриваемое как смещение в час-минуту-секунду, в календарной системе ISO-8601, например 10:15:30+01:00 .

Этот класс хранит все поля времени с точностью до наносекунд, а также смещение зоны . Например, Время смещения может хранить значение “13:45.30.123456789+02:00”.

Давайте получим текущее Время смещения с 2 часами смещения:

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00");
OffsetTime time = OffsetTime.now(zoneOffSet);

4. Заключение

Возвращаясь к фокусу, Смещение зоны представляет собой представление часового пояса с точки зрения разницы между GMT/UTC и заданным временем. Это удобный способ представления часового пояса, хотя существуют и другие представления.

Более того, ZoneId и ZoneOffset используются не только независимо, но и некоторыми классами Date Time Java, такими как ZonedDateTime , OffsetDateTime и OffsetTime .

Как обычно, код доступен в нашем репозитории GitHub .