Konversikan Tanggal ke TanggalLokal atau TanggalLokalData dan Kembali

1. Ikhtisar

Dimulai dengan Java 8, kami memiliki API Tanggal baru: java.time .

Namun, terkadang kami masih perlu melakukan konversi antara API baru dan lama, dan bekerja dengan representasi tanggal dari keduanya.

2. Mengubah java.util.Date ke java.time.LocalDate

Mari kita mulai dengan mengubah representasi tanggal lama ke yang baru.

Di sini, kita dapat memanfaatkan metode toInstant () baru , yang telah ditambahkan ke java.util.Date di Java 8.

Saat kita mengonversi objek Instan , itu diperlukan untuk menggunakan ZoneId karenaObjek instan adalah agnostik zona waktu - hanya menunjuk pada garis waktu.

The atZone (zona ZoneId) API dari Instant objek mengembalikan ZonedDateTime , jadi kita hanya perlu mengekstrak LOCALDATE dari itu menggunakan toLocalDate () metode.

Pertama, kami menggunakan sistem default ZoneId :

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); }

Dan solusi serupa tetapi dengan cara berbeda untuk membuat objek Instan - menggunakan metode ofEpochMilli () :

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); }

Sebelum kita melanjutkan, mari kita lihat sekilas kelas java.sql.Date lama dan bagaimana itu dapat diubah menjadi LocalDate juga.

Dimulai dengan Java 8, kita dapat menemukan metode toLocalDate () tambahan di java.sql.Date , yang juga memberi kita cara mudah untuk mengubahnya menjadi java.time.LocalDate .

Dalam hal ini, kami tidak perlu mengkhawatirkan zona waktu:

public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); }

Sangat mirip, kita dapat mengonversi objek Date lama menjadi objek LocalDateTime juga. Mari kita lihat selanjutnya.

3. Mengubah java.util.Date ke java.time.LocalDateTime

Untuk mendapatkan instance LocalDateTime , kita juga dapat menggunakan perantara ZonedDateTime dan kemudian menggunakan API toLocalDateTime () .

Sama seperti sebelumnya, kita dapat menggunakan dua solusi yang mungkin untuk mendapatkan objek Instan dari java.util.Date :

public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }

Dan dimulai dengan Java 8, kita juga bisa menggunakan java.sql.Timestamp untuk mendapatkan LocalDateTime :

ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { return new java.sql.Timestamp( dateToConvert.getTime()).toLocalDateTime(); }

4. Konversi java.time.LocalDate ke java.util.Date

Sekarang setelah kita memiliki pemahaman yang baik tentang cara mengonversi dari representasi data lama ke yang baru, mari kita lihat mengonversi ke arah lain.

Kami akan membahas dua cara yang mungkin untuk mengubah LocalDate menjadi Date .

Pertama, kami menggunakan metode valueOf (LocalDate date) baru yang disediakan dalam objek java.sql.Date , yang menggunakan LocalDate sebagai parameter:

public Date convertToDateViaSqlDate(LocalDate dateToConvert) { return java.sql.Date.valueOf(dateToConvert); }

Seperti yang bisa kita lihat, ini mudah dan intuitif. Ini menggunakan zona waktu lokal untuk konversi (semua dilakukan di bawah tenda, jadi tidak perlu khawatir).

Di lain Jawa 8 contoh, kita menggunakan Instant objek yang kita lolos ke dari (Instant instan) metode java.util.Date objek:

public Date convertToDateViaInstant(LocalDate dateToConvert) { return java.util.Date.from(dateToConvert.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); }

Perhatikan bahwa kita menggunakan objek Instan di sini dan kita juga perlu memperhatikan zona waktu saat melakukan konversi ini.

Selanjutnya, mari gunakan solusi yang sangat mirip untuk mengonversi LocalDateTime menjadi objek Date .

5. Konversi java.time.LocalDateTime ke java.util.Date

Cara termudah untuk mendapatkan sebuah java.util.Date dari LocalDateTime adalah dengan menggunakan perluasan ke java.sql.Timestamp - tersedia dengan Java 8:

public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { return java.sql.Timestamp.valueOf(dateToConvert); }

Tapi tentu saja, solusi alternatif adalah menggunakan sebuah Instant objek, yang kita peroleh dari ZonedDateTime :

Date convertToDateViaInstant(LocalDateTime dateToConvert) { return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) .toInstant()); }

6. Penambahan Java 9

Di Java 9, tersedia metode baru yang menyederhanakan konversi antara java.util.Date dan java.time.LocalDate atau java.time.LocalDateTime .

LocalDate.ofInstant (Instan instan, zona ZoneId) dan LocalDateTime.ofInstant (Instan instan, zona ZoneId) menyediakan pintasan praktis:

public LocalDate convertToLocalDate(Date dateToConvert) { return LocalDate.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); } public LocalDateTime convertToLocalDateTime(Date dateToConvert) { return LocalDateTime.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); }

7. Kesimpulan

Pada artikel ini, kami membahas cara yang mungkin untuk mengubah java.util.Date lama menjadi java.time.LocalDate baru dan java.time.LocalDateTime , serta sebaliknya.

Implementasi lengkap artikel ini tersedia di GitHub.