Belgeleri okudum, ama hala birini veya diğerini kullanmam gerektiğinde alamıyorum:
Belgelere göre OffsetDateTime
veri tabanına tarih yazarken kullanılmalı, ama nedenini anlamıyorum.
Belgeleri okudum, ama hala birini veya diğerini kullanmam gerektiğinde alamıyorum:
Belgelere göre OffsetDateTime
veri tabanına tarih yazarken kullanılmalı, ama nedenini anlamıyorum.
Yanıtlar:
S: Java 8 ZonedDateTime ve OffsetDateTime arasındaki fark nedir?
Javadoclar bunu söylüyor:
"
OffsetDateTime
,ZonedDateTime
VeInstant
tüm mağaza nanosaniye hassasiyet için zaman hattında bir anlık.Instant
, Basitçe anında en basit temsil ediyor.OffsetDateTime
Anında yerel tarih-saat elde edilmesini sağlar UTC / Greenwich, ofset. EklediğiZonedDateTime
tam zamanlı ekler -Zone kuralları. "
Kaynak: https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html
Böylece arasındaki fark OffsetDateTime
ve ZonedDateTime
ikinci 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:
OffsetDateTime
Veritabanı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. ZonedDateTime
Sü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ış) ZonedDateTime
değerler kalıcı ve daha sonra kullanıldığında daha büyük bir sorundur .
ZonedDateTime
de ben okudum ne DST anahtarlama vb dahil olmak üzere zaman dilimleri hakkında bilgi içerir.