Kısa cevap:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Açıklama: ( hakkında bu soruya dayanarak LocalDate
)
Adına rağmen, java.util.Date
bir "tarih" değil, zaman çizgisinde bir anı temsil eder. Nesne içinde saklanan gerçek veriler, long
1970-01-01T00: 00Z'den (1970 GMT / UTC'nin başında gece yarısı) bu yana geçen milisaniye sayısıdır.
java.util.Date
JSR-310'daki eşdeğer sınıf şöyledir Instant
, bu nedenle ve sonra dönüşümü sağlamak için uygun yöntemler vardır:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
Bir java.util.Date
örneğin saat dilimi kavramı yoktur. Aradığınızda, bu garip görünebilir toString()
bir üzerinde java.util.Date
çünkü toString
bir zaman dilimine göre yapılır. Ancak bu yöntem aslında dizeyi sağlamak için Java'nın varsayılan saat dilimini anında kullanır. Saat dilimi, gerçek durumunun bir parçası değildir java.util.Date
.
Bir Instant
de zaman dilimine hakkında herhangi bir bilgi içermez. Bu nedenle, 'den Instant
yerel bir tarih-saate dönüştürmek için bir saat dilimi belirtmek gerekir. Bu varsayılan bölge olabilir - ZoneId.systemDefault()
- veya uygulamanızın kontrol ettiği bir saat dilimi olabilir, örneğin kullanıcı tercihlerinden bir saat dilimi. LocalDateTime
hem anında hem de saat dilimini alan uygun bir fabrika yöntemine sahiptir:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Tersine, LocalDateTime
saat dilimi atZone(ZoneId)
yöntem çağrılarak belirtilir . Daha ZonedDateTime
sonra doğrudan bir şeye dönüştürülebilir Instant
:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Not dönüşüm olduğunu LocalDateTime
için ZonedDateTime
beklenmeyen davranışlar tanıtmak potansiyeline sahiptir. Bunun nedeni, Yaz Saati Uygulaması nedeniyle her yerel tarih-saatin mevcut olmamasıdır. Sonbahar / sonbaharda, yerel zaman çizgisinde aynı yerel tarih saatinin iki kez oluştuğu bir çakışma vardır. İlkbaharda, bir saatin kaybolduğu bir boşluk var. atZone(ZoneId)
Dönüşümün ne yapacağına ilişkin daha fazla tanım için Javadoc'a bakın .
Özet olarak, java.util.Date
a LocalDateTime
ve a arasında bir dönüş java.util.Date
yaparsanız, Yaz Saati Uygulaması nedeniyle farklı bir anlık sonuç elde edebilirsiniz.
Ek bilgi: Çok eski tarihleri etkileyecek başka bir fark daha var. java.util.Date
15 Ekim 1582'de, Gregoryen takvimi yerine Julian takvimini kullanmaktan önceki tarihlerle değişen bir takvim kullanır. Buna karşılık, java.time.*
ISO takvim sistemini (Gregoryen'e eşdeğer) her zaman kullanır. Çoğu kullanım durumunda, ISO takvim sistemi istediğiniz şeydir, ancak 1582 yılından önceki tarihleri karşılaştırırken garip etkiler görebilirsiniz.