Saya ingin mengonversi java.time.LocalDate
menjadi java.util.Date
tipe. Karena saya ingin mengatur tanggal JDateChooser
. Atau adakah pemilih tanggal yang mendukung java.time
tanggal?
Saya ingin mengonversi java.time.LocalDate
menjadi java.util.Date
tipe. Karena saya ingin mengatur tanggal JDateChooser
. Atau adakah pemilih tanggal yang mendukung java.time
tanggal?
Jawaban:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Itu mengasumsikan pemilih tanggal Anda menggunakan zona waktu default sistem untuk mengubah tanggal menjadi string.
atStartOfDay()
, karena itu mengubah nilai tanggal, seperti yang saya mengerti.
Ini kelas utilitas yang saya gunakan untuk mengonversi java.time
kelas yang lebih baru ke java.util.Date
objek dan sebaliknya:
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class DateUtils {
public static Date asDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static LocalDate asLocalDate(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
}
public static LocalDateTime asLocalDateTime(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
Diedit berdasarkan pada komentar @Oliv.
ZoneId.systemDefault()
bermasalah karena zona waktu berubah berdasarkan corse tahun ini. Jadi jika pada 01-Jan saya berada di zona waktu -05: 00 (tengah), tetapi kemudian pada 01-Juli saya berada di zona waktu -06: 00 (tengah hari) tidak akan menyebabkan hasil yang tidak akurat karena penghematan siang hari waktu?
Anda dapat menggunakan java.sql.Date.valueOf()
metode sebagai:
Date date = java.sql.Date.valueOf(localDate);
Tidak perlu menambahkan waktu dan info zona waktu di sini karena mereka diambil secara implisit.
Lihat LocalDate ke java.util.Date dan sebaliknya konversi paling sederhana?
java.sql.Date
dimaksudkan untuk lapisan basis data, JDBC, JPA. Lapisan web (atau aplikasi klien apa pun) harus benar-benar bebas dari ketergantungan apa pun java.sql.*
.
java.sql.Date
hanya java.util.Date
dengan waktu yang ditentukan 00:00:00
tetapi titik dalam perspektif desain adalah yang java.sql.*
tidak dimaksudkan untuk lapisan depan yang berinteraksi dengan klien seperti Servlets / JSP. java.util.Date
di sisi Jawa dan java.sql.Timestamp
atau apa pun yang berlaku dari java.sql.*
di sisi JDBC .
java.sql.*
kelas akan menjadi ketergantungan yang terpisah.
java.time memiliki antarmuka Temporal yang dapat Anda gunakan untuk membuat objek Instan dari sebagian besar kelas waktu. Instan mewakili milidetik pada garis waktu di Zaman - referensi dasar untuk semua tanggal dan waktu lainnya.
Kita perlu mengonversi Tanggal menjadi ZonedDateTime, dengan Waktu dan Zona, untuk melakukan konversi:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Untuk membuat java.util.Date dari java.time.LocalDate , Anda harus melakukannya
Kode tersebut mungkin terlihat sebagai berikut:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
ini diwarisi dari java.time.chrono.ChronoZonedDateTime
. Lihat docs.oracle.com/javase/8/docs/api/java/time/chrono/…
Ini bekerja untuk saya:
java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--
Solusi Kotlin:
1) Tempel fungsi ekstensi ini di suatu tempat.
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) Gunakan, dan jangan pernah google ini lagi.
val myDate = myLocalDate.toDate()
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
}
Sederhana
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());