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

1. Общ преглед

ZonedDateTime и OffsetDateTime са доста популярни класове в Java 8 DateTime API . Освен това и двете съхраняват миг на времевата линия с точност до наносекунди . И в началото може да ви обърка изборът между тях.

В този бърз урок ще разгледаме разликите между ZonedDateTime и OffsetDateTime .

2. ZonedDateTime

А ZonedDateTime е неизменна представяне на дата-време с часовите зони в ISO-8601 календарна система, като 2007-12-03T10: 15: 30 + 01: 00 Европа / Пари и. Той съдържа състояние, еквивалентно на три отделни обекта: LocalDateTime , 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.