ZonedDateTime ve OffsetDateTime arasındaki fark nedir?


155

Belgeleri okudum, ama hala birini veya diğerini kullanmam gerektiğinde alamıyorum:

Belgelere göre OffsetDateTimeveri tabanına tarih yazarken kullanılmalı, ama nedenini anlamıyorum.


4
Temelde bir ZonedDateTimede ben okudum ne DST anahtarlama vb dahil olmak üzere zaman dilimleri hakkında bilgi içerir.
fge

Yanıtlar:


187

S: Java 8 ZonedDateTime ve OffsetDateTime arasındaki fark nedir?

Javadoclar bunu söylüyor:

" OffsetDateTime, ZonedDateTimeVe Instanttüm mağaza nanosaniye hassasiyet için zaman hattında bir anlık. Instant, Basitçe anında en basit temsil ediyor. OffsetDateTimeAnında yerel tarih-saat elde edilmesini sağlar UTC / Greenwich, ofset. Eklediği ZonedDateTimetam zamanlı ekler -Zone kuralları. "

Kaynak: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

Böylece arasındaki fark OffsetDateTimeve ZonedDateTimeikinci kapak yaz saati ayarlamaları ve diğer çeşitli anomaliler olduğunu kuralları içerir olmasıdır.

Basitçe ifade etmek gerekirse:

Saat Dilimi = ( UTC'den Uzaklık + Anormallikler İçin Kurallar)


S: OffsetDateTimeVeritabanına tarih yazarken belgelere göre kullanılmalı, ancak nedenini anlamıyorum.

Yerel saat ofsetleri olan tarihler her zaman aynı örnekleri temsil eder ve bu nedenle istikrarlı bir sıralamaya sahiptir. Buna karşılık, tam saat dilimi bilgisine sahip tarihlerin anlamı, ilgili zaman dilimlerinin kurallarında yapılan düzenlemeler karşısında kararsızdır. (Ve bunlar olur; örneğin gelecekteki tarih-saat değerleri için.) Bu nedenle ZonedDateTime, bir uygulamayı depolar ve alırsanız bir sorun vardır:

  • Hesaplanan ofseti saklayabilir ... ve alınan nesne, bölge kimliği için geçerli kurallarla tutarsız bir ofsete sahip olabilir.

  • Hesaplanan ofseti atabilir ... ve alınan nesne daha sonra mutlak / evrensel zaman çizelgesinde depolanandan farklı bir noktayı temsil eder.

Java nesnesi serileştirmesi kullanıyorsanız, Java 9 uygulaması ilk yaklaşımı kullanır. Bu, bununla başa çıkmanın "daha doğru" yoludur, ancak bu belgelenmemiş gibi görünmektedir. (JDBC sürücüleri ve ORM bağlamaları muhtemelen benzer kararlar veriyor ve umarım doğru şekilde yapıyorlar.)

Ancak, tarih / saat değerlerini manuel olarak saklayan veya buna dayanan bir uygulama yazıyorsanız java.sql.DateTime, bir bölge kimliğinin komplikasyonlarıyla uğraşmak ... muhtemelen kaçınılması gereken bir şeydir. Dolayısıyla tavsiye.

Anlamı / sıralaması zaman içinde kararsız olan tarihlerin bir uygulama için sorunlu olabileceğini unutmayın . Bölge kurallarındaki değişiklikler önemli bir durum olduğundan, sorunlar beklenmedik zamanlarda ortaya çıkmaya eğilimlidir.


Tavsiyenin (olası) ikinci bir nedeni ZonedDateTime, a'nın inşasının belirli noktalarda belirsiz olmasıdır. Örneğin, "saatleri geri koyduğunuz" zaman diliminde, yerel saati ve bölge kimliğini birleştirmek size iki farklı ofset verebilir. ZonedDateTimeSürekli olarak diğer üzerinden bir bulacaktır ... ama bu her zaman doğru seçim değildir.

Şimdi, bu ZonedDateTimeşekilde değerler oluşturan herhangi bir uygulama için bu bir sorun olabilir . Ancak, bir kurumsal uygulama oluşturan birinin bakış açısından (muhtemelen yanlış) ZonedDateTimedeğerler kalıcı ve daha sonra kullanıldığında daha büyük bir sorundur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.