Jaka jest różnica między Zoneddatetime a OffsetDateTime?

Przeczytałem dokumentację, ale nadal nie mogę dostać, kiedy powinienem użyć jednego lub drugiego:

Zgodnie z dokumentacją OffsetDateTime powinny być używane przy zapisie daty do bazy danych, ale nie rozumiem dlaczego.

Author: Lii, 2015-05-14

1 answers

P: Jaka jest różnica między java 8 ZonedDateTime a OffsetDateTime?

Javadocowie mówią tak:

"OffsetDateTime, ZonedDateTime / align = "left" / Instant jest najprostszym, po prostu reprezentującym moment. OffsetDateTime dodaje do natychmiastowego offsetu z UTC / Greenwich, co pozwala na uzyskanie lokalnej daty i czasu. ZonedDateTime dodaje pełne Zasady strefy czasowej."

Źródło: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

Różnica między OffsetDateTime i ZonedDateTime polega na tym, że ta ostatnia zawiera zasady, które obejmują korekty czasu letniego i różne inne anomalie.

Powiedział po prostu:

Strefa czasowa = ( Offset-From-UTC + Rules-For-Anomalies)


Q: zgodnie z dokumentacją OffsetDateTime należy stosować przy zapisie daty do baza danych, ale nie rozumiem dlaczego.

Daty z przesunięciami czasu lokalnego zawsze reprezentują te same momenty w czasie, a zatem mają stabilną kolejność. Natomiast znaczenie dat z pełną informacją o strefach czasowych jest niestabilne w obliczu zmian zasad dla odpowiednich stref czasowych. (I tak się dzieje; np. dla wartości date-time w przyszłości. Jeśli więc przechowujesz i pobierasz ZonedDateTime implementacja ma problem:

  • Może przechowywać obliczony offset ... następnie pobrany obiekt może mieć przesunięcie niezgodne z aktualnymi regułami dla zone-id.

  • Może odrzucić obliczone przesunięcie ... a następnie pobrany obiekt reprezentuje inny punkt w absolutnej / uniwersalnej osi czasu niż ten, który został zapisany.

Jeśli używasz Java object serialization, implementacja Java 9 przyjmuje pierwsze podejście. Jest to prawdopodobnie "bardziej poprawny" sposób radzenia sobie z tym, ale to nie wydaje się być udokumentowane. (Sterowniki JDBC i wiązania ORM prawdopodobnie podejmują podobne decyzje i miejmy nadzieję, że dobrze się to sprawdzą.)

Ale jeśli piszesz aplikację, która ręcznie przechowuje wartości daty/czasu, lub która opiera się na java.sql.DateTime, to radzenie sobie z komplikacjami zone-id jest ... prawdopodobnie coś, czego należy unikać. Stąd ta rada.

Zauważ, że daty, których znaczenie / kolejność jest niestabilna w czasie mogą być problematyczne dla aplikacji. A ponieważ zmiany w regułach strefowych są przypadkami skrajnymi, problemy mogą pojawić się w nieoczekiwanych momentach.


Drugim (możliwym) powodem Porady Jest to, że konstrukcja ZonedDateTime jest niejednoznaczna w pewnych punktach. Na przykład w okresie, w którym "odkładasz zegary z powrotem", połączenie czasu lokalnego i identyfikatora strefy może dać ci dwa różne przesunięcia. ZonedDateTime będzie konsekwentnie wybierać jedno nad drugim ... ale to nie zawsze jest poprawne wybór.

Teraz, to może być problem dla wszystkich aplikacji, które konstruują ZonedDateTime wartości w ten sposób. Ale z perspektywy kogoś, kto buduje aplikację korporacyjną, jest większym problemem, gdy (Być może niepoprawne) wartości ZonedDateTime są trwałe i używane później.

 194
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-11 02:39:38