Jawaban singkat:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Penjelasan: (berdasarkan pertanyaan ini tentang LocalDate
)
Meskipun namanya, java.util.Date
mewakili instan di garis waktu, bukan "tanggal". Data aktual yang disimpan dalam objek adalah long
hitungan milidetik sejak 1970-01-01T00: 00Z (tengah malam pada awal 1970 GMT / UTC).
Kelas yang setara dengan java.util.Date
di JSR-310 adalah Instant
, jadi ada metode yang mudah untuk menyediakan konversi ke sana kemari:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
Sebuah java.util.Date
instance tidak memiliki konsep zona waktu. Ini mungkin tampak aneh jika Anda memanggil toString()
pada java.util.Date
, karena toString
relatif ke-zona waktu. Namun metode itu benar-benar menggunakan zona waktu default Java on the fly untuk memberikan string. Zona waktu bukan bagian dari keadaan aktual java.util.Date
.
An Instant
juga tidak mengandung informasi apa pun tentang zona waktu. Jadi, untuk mengkonversi dari Instant
tanggal waktu setempat ke waktu perlu menentukan zona waktu. Ini mungkin zona default - ZoneId.systemDefault()
- atau mungkin zona waktu yang dikontrol aplikasi Anda, seperti zona waktu dari preferensi pengguna. LocalDateTime
memiliki metode pabrik yang nyaman yang menggunakan zona waktu instan dan waktu:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Secara terbalik, LocalDateTime
zona waktu ditentukan dengan memanggil atZone(ZoneId)
metode. The ZonedDateTime
kemudian dapat dikonversi langsung ke Instant
:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Perhatikan bahwa konversi dari LocalDateTime
ke ZonedDateTime
memiliki potensi untuk memperkenalkan perilaku yang tidak terduga. Ini karena tidak setiap tanggal lokal ada karena Waktu Musim Panas. Pada musim gugur / musim gugur, ada tumpang tindih dalam garis waktu lokal di mana waktu tanggal lokal yang sama terjadi dua kali. Di musim semi, ada celah, di mana satu jam menghilang. Lihat Javadoc atZone(ZoneId)
untuk lebih banyak definisi tentang apa yang akan dilakukan konversi.
Ringkasan, jika Anda pulang pergi java.util.Date
ke LocalDateTime
dan kembali ke, java.util.Date
Anda mungkin berakhir dengan instan berbeda karena Waktu Musim Panas.
Info tambahan: Ada perbedaan lain yang akan mempengaruhi tanggal yang sangat lama. java.util.Date
menggunakan kalender yang berubah pada 15 Oktober 1582, dengan tanggal sebelumnya menggunakan kalender Julian alih-alih kalender Gregorian. Sebaliknya, java.time.*
gunakan sistem kalender ISO (setara dengan Gregorian) untuk sepanjang masa. Dalam kebanyakan kasus penggunaan, sistem kalender ISO adalah yang Anda inginkan, tetapi Anda mungkin melihat efek aneh ketika membandingkan tanggal sebelum tahun 1582.