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