Яка різниця між ZonedDateTime та OffsetDateTime?


155

Я прочитав документацію, але все ще не можу отримати, коли мені слід використовувати те чи інше:

Відповідно до документації OffsetDateTimeслід використовувати при записі дати в базу даних, але я не розумію чому.


4
В основному а ZonedDateTimeтакож містить інформацію про часові пояси, включаючи перемикання DST тощо з того, що я прочитав.
fge

Відповіді:


187

З: Яка різниця між java 8 ZonedDateTime та OffsetDateTime?

Javadocs говорять так:

" OffsetDateTime, ZonedDateTimeІ Instantвесь магазин миттєво на лінію часу в наносекундной точність. InstantЄ найпростішим, просто представляючи в той момент. OffsetDateTimeДодає до моменту усунення від UTC / Грінвіча, який дозволяє місцева датою і часом , щоб отримати. ZonedDateTimeДодає повний робочий день -зони правила ".

Джерело: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

Таким чином, різниця між OffsetDateTimeі ZonedDateTimeполягає в тому, що остання включає правила, які стосуються коригування літнього часу та різних інших аномалій.

Заявлено просто:

Часова зона = ( Зсув-Від-UTC + Правила-Для аномалій)


З: Відповідно до документації OffsetDateTimeслід використовувати при записі дати в базу даних, але я не розумію, чому.

Дати з місцевими компенсаціями часу завжди представляють однакові моменти в часі, тому мають стабільне впорядкування. Навпаки, значення дат із повною інформацією про часовий пояс нестабільне за умови коригування правил для відповідних часових поясів. (І це трапляється; наприклад, для значень дати та часу в майбутньому.) Отже, якщо ви зберігаєте та потім отримуєте a, ZonedDateTimeреалізація має проблеми:

  • Він може зберігати обчислені зсуви ..., а потім отриманий об'єкт може мати зміщення, що не відповідає поточним правилам для зони id.

  • Він може відкинути обчислене зміщення ... і отриманий об'єкт представляє іншу точку в абсолютній / універсальній часовій шкалі, ніж ту, що зберігалася.

Якщо ви використовуєте серіалізацію об'єктів Java, реалізація Java 9 використовує перший підхід. Це, мабуть, "правильніший" спосіб вирішення цього питання, але це, здається, не задокументоване. (Драйвери JDBC та прив'язки до ORM, імовірно, приймають подібні рішення, і, сподіваємось, виправляємо це.)

Але якщо ви пишете заявку, яка вручну зберігає значення дати / часу, або на яку покладаєтесь java.sql.DateTime, то вирішення ускладнень ідентифікатора зони є, ймовірно, чого слід уникати. Звідси порада.

Зауважте, що дати, значення чи впорядкування яких нестабільні з часом, можуть бути проблематичними для програми. Оскільки зміни в зональних правилах є крайнім випадком, проблеми можуть виникнути несподівано.


(Можлива) друга причина поради полягає в тому, що побудова а ZonedDateTimeє неоднозначною в певних моментах. Наприклад, у період часу, коли ви "повертаєте годинник", поєднання місцевого часу та ідентифікатора зони може дати вам два різних зміщення. ZonedDateTimeБуде послідовно вибрати один над іншим ... але це не завжди правильний вибір.

Тепер це може бути проблемою для будь-яких додатків, які будують ZonedDateTimeзначення таким чином. Але з точки зору того, хто створює корпоративну програму, це більша проблема, коли (можливо, неправильні) ZonedDateTimeзначення зберігаються та використовуються пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.