ZoneOffset в Java

ZoneOffset в Java

1. Вступление

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

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

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

В этой статьеwe’ll discuss ZoneId and ZoneOffset as well as related DateTime classes.

Мы также можем прочитать о новом наборе классовDateTime, представленном в Java 8, в нашемprevious post.

2. ZoneId иZoneOffset

С появлениемJSR-310 были добавлены некоторые полезные API-интерфейсы для управления датой, временем и часовыми поясами. КлассыZoneId иZoneOffset также были добавлены как часть этого обновления.

2.1. ZoneIdс

Как указано выше,ZoneId is a representation of the time-zone, например «Europe/Paris».

Есть 2 реализацииZoneId. Во-первых, с фиксированным смещением по сравнению с GMT / UTC. А во-вторых, как географический регион, в котором есть набор правил для расчета смещения по GMT / UTC.

Давайте создадимZoneId для Берлина, Германия:

ZoneId zone = ZoneId.of("Europe/Berlin");

2.2. ZoneOffsetс

ZoneOffset extends ZoneId anddefinesthe fixed offset of the current time-zone with GMT/UTC, например +02: 00.

Это означает, что это число представляет фиксированные часы и минуты, представляющие разницу между временем в текущем часовом поясе и GMT / UTC:

LocalDateTime now = LocalDateTime.now();
ZoneId zone = ZoneId.of("Europe/Berlin");
ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

In case a country has 2 different offsets – in summer and winter, there will be 2 different ZoneOffset implementations for the same region, hence the need to specify a LocalDateTime.

3. DateTime Классы

Теперь давайте обсудим некоторые классыDateTime, которые фактически используютZoneId иZoneOffset.

3.1. ZonedDateTimeс

ZonedDateTime - неизменное представление даты и времени с часовым поясом в календарной системе ISO-8601, например2007-12-03T10:15:30+01:00 Europe/Paris. ZonedDateTime holds state equivalent to three separate objects, a LocalDateTime, a ZoneId and the resolved ZoneOffset

Этот класс хранит все поля даты и времени с точностью до наносекунд и часовой пояс сZoneOffset, чтобы обрабатывать неоднозначные локальные даты и время. Например,ZonedDateTime может хранить значение «2 октября 2007 г., 13: 45.30.123456789 +02: 00 в часовом поясе Европа / Париж».

Получим текущийZonedDateTime для предыдущего региона:

ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime date = ZonedDateTime.now(zone);

ZonedDateTime also предоставляет встроенные функции для преобразования заданной даты из одного часового пояса в другой:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTimeс

OffsetDateTime - неизменное представление даты и времени со смещением в календарной системе ISO-8601, например2007-12-03T10:15:30+01:00.

This class stores all date and time fields, to a precision of nanoseconds, as well as the offset from 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с

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

This class stores all time fields, to a precision of nanoseconds, as well as a zone offset. Например,OffsetTime может хранить значение «13: 45.30.123456789 + 02: 00».

Получим текущийOffsetTime с двухчасовым смещением:

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

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

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

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

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