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

Различия между ZonedDateTime и OffsetDateTime

Исследуйте различия между классами ZonedDateTime и OffsetDateTime в Java

Автор оригинала: 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 .