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 .