Я прочитав документацію, але все ще не можу отримати, коли мені слід використовувати те чи інше:
Відповідно до документації OffsetDateTime
слід використовувати при записі дати в базу даних, але я не розумію чому.
Я прочитав документацію, але все ще не можу отримати, коли мені слід використовувати те чи інше:
Відповідно до документації OffsetDateTime
слід використовувати при записі дати в базу даних, але я не розумію чому.
Відповіді:
З: Яка різниця між 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
значення зберігаються та використовуються пізніше.
ZonedDateTime
також містить інформацію про часові пояси, включаючи перемикання DST тощо з того, що я прочитав.