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.Datebir "tarih" değil, zaman çizgisinde bir anı temsil eder. Nesne içinde saklanan gerçek veriler, long1970-01-01T00: 00Z'den (1970 GMT / UTC'nin başında gece yarısı) bu yana geçen milisaniye sayısıdır.
java.util.DateJSR-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ü toStringbir 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 Instantde zaman dilimine hakkında herhangi bir bilgi içermez. Bu nedenle, 'den Instantyerel 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. LocalDateTimehem 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, LocalDateTimesaat dilimi atZone(ZoneId)yöntem çağrılarak belirtilir . Daha ZonedDateTimesonra 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 LocalDateTimeiçin ZonedDateTimebeklenmeyen 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.Datea LocalDateTimeve a arasında bir dönüş java.util.Dateyaparsanı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.Date15 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.