Автор оригинала: Shubhra Srivastava.
1. Обзор
ZonedDateTime и OffsetDateTime являются довольно популярными классами в API Java 8 DateTime . Кроме того, оба хранят мгновение на временной шкале с точностью до наносекунд . И поначалу выбор между ними может привести к путанице.
В этом кратком руководстве мы рассмотрим различия между ZonedDateTime и OffsetDateTime .
2. ZonedDateTime
A ZonedDateTime -это неизменяемое представление даты-времени с часовым поясом в календарной системе ISO-8601, например 2007-12-03T10:15:30+01:00 Europe/Pari s. Он содержит состояние , эквивалентное трем отдельным объектам: a LocalDateTime , a ZoneId и разрешенный ZoneOffset .
Здесь ZoneId определяет, как и когда изменяется смещение. Таким образом, смещение не может быть свободно установлено, так как зона контролирует, какие смещения допустимы.
Чтобы получить текущее ZonedDateTime для конкретного региона, мы будем использовать:
ZoneId zone = ZoneId.of("Europe/Berlin"); ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);
Класс ZonedDateTime также предоставляет встроенные методы для преобразования заданной даты из одного часового пояса в другой:
ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);
Наконец, он полностью поддерживает DST и обрабатывает настройки летнего времени. Это часто пригодится, когда мы хотим отобразить поле даты и времени в определенном часовом поясе.
3. OffsetDateTime
OffsetDateTime -это неизменяемое представление даты-времени со смещением от UTC/Гринвича в календарной системе ISO-8601, например 2007-12-03T10:15:30+01:00 . Другими словами, он хранит все поля даты и времени с точностью до наносекунд, а также смещение от GMT/UTC .
Давайте получим текущее OffsetDateTime с двухчасовым смещением от GMT/UTC:
ZoneOffset zoneOffSet= ZoneOffset.of("+02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);
4. Основные Отличия
Во-первых, нет смысла (без конверсий) напрямую сравнивать две даты с полной информацией о часовом поясе. Поэтому мы всегда должны предпочитать хранить OffsetDateTime в базе данных над ZonedDateTime , поскольку даты со смещением по местному времени всегда представляют одни и те же моменты времени.
Более того, в отличие от ZonedDateTime , добавление индекса над столбцом, хранящим OffsetDateTime , не изменит значение даты.
Давайте быстро подведем итоги ключевых различий.
ZonedDateTime :
- хранит все поля даты и времени с точностью до наносекунд и часовой пояс со смещением зоны, используемым для обработки неоднозначных локальных значений даты и времени
- нельзя свободно устанавливать смещения, так как зона контролирует допустимые значения смещения
- полностью осведомлен о DST и обрабатывает корректировки перехода на летнее время
- удобно для отображения полей даты и времени в определенном пользователем часовом поясе
OffsetDateTime :
- сохраняет все поля даты и времени с точностью до наносекунд, а также смещение от GMT/UTC (без информации о часовом поясе)
- следует использовать для хранения даты в базе данных или передачи ее по сети
5. Заключение
В этом уроке мы рассмотрели различия между ZonedDateTime и OffsetDateTime .
Как обычно, полный исходный код доступен на Github .