Tukar Tarikh ke LocalDate atau LocalDateTime dan Kembali

1. Gambaran keseluruhan

Bermula dengan Java 8, kami mempunyai API Tarikh baru: java.time .

Walau bagaimanapun, kadang-kadang kita masih perlu melakukan penukaran antara API baru dan lama, dan bekerja dengan perwakilan tarikh dari kedua-duanya.

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

Mari kita mulakan dengan menukar perwakilan tarikh lama ke yang baru.

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

Semasa kita menukar objek Segera , ia dikehendaki menggunakan ZoneId keranaObjek segera adalah zon waktu agnostik - hanya menunjukkan pada garis masa.

The atZone (zon ZoneId) API dari Segera objek mengembalikan ZonedDateTime , jadi kita hanya perlu mengeluarkan LOCALDATE daripadanya menggunakan toLocalDate () kaedah.

Pertama, kita menggunakan sistem lalai ZoneId :

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

Dan penyelesaian yang serupa tetapi dengan cara yang berbeza untuk membuat objek Segera - menggunakan kaedahEpochMilli () :

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

Sebelum kita teruskan, mari kita lihat juga kelas java.sql.Date lama dan bagaimana ia boleh ditukar menjadi LocalDate juga.

Bermula dengan Java 8, kita dapat mencari kaedah toLocalDate () tambahan pada java.sql.Date , yang juga memberi kita cara mudah untuk mengubahnya menjadi java.time.LocalDate .

Dalam kes ini, kita tidak perlu bimbang tentang zon waktu:

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

Sama juga, kita boleh menukar objek Date lama menjadi objek LocalDateTime juga. Mari kita lihat seterusnya.

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

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

Sama seperti sebelumnya, kita boleh menggunakan dua penyelesaian yang mungkin untuk mendapatkan objek Segera dari java.util. Tarikh :

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 bermula dengan Java 8, kita juga dapat menggunakan java.sql.Timestamp untuk mendapatkan LocalDateTime :

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

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

Sekarang kita mempunyai pemahaman yang baik tentang bagaimana menukar dari perwakilan data lama ke yang baru, mari kita lihat menukar ke arah lain.

Kami akan membincangkan dua cara yang mungkin untuk menukar LocalDate kepada Tarikh .

Pada yang pertama, kami menggunakan kaedah valueOf (tarikh LocalDate) baru yang disediakan dalam objek java.sql.Date , yang mengambil LocalDate sebagai parameter:

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

Seperti yang kita lihat, ia mudah dan intuitif. Ia menggunakan zon waktu tempatan untuk penukaran (semua dilakukan di bawah tenda, jadi tidak perlu risau).

Di Jawa 8 contoh yang lain, kami gunakan Segera objek yang kita lulus ke dari (Segera segera) kaedah java.util.Date objek:

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

Perhatikan bahawa kita menggunakan objek Instan di sini dan bahawa kita juga perlu mengambil berat tentang zon waktu ketika melakukan penukaran ini.

Seterusnya, mari kita gunakan penyelesaian yang sangat serupa untuk menukar LocalDateTime ke objek Date .

5. Convert java.time.LocalDateTime to java.util.Date

The easiest way of getting a java.util.Date from LocalDateTime is to use an extension to thejava.sql.Timestamp — available with Java 8:

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

But of course, an alternative solution is using an Instant object, which we obtain from ZonedDateTime:

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

6. Java 9 Additions

In Java 9, there are new methods available that simplify conversion between java.util.Date and java.time.LocalDate or java.time.LocalDateTime.

LocalDate.ofInstant (Instant Instan, ZoneId zone) dan LocalDateTime.ofInstant (Instant instan, ZoneId zone) menyediakan jalan pintas yang berguna:

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. Kesimpulannya

Dalam artikel ini, kami membahas kemungkinan cara menukar java.util.Date lama menjadi java.time.LocalDate dan java.time.LocalDateTime baru, dan sebaliknya .

Pelaksanaan penuh artikel ini boleh didapati di GitHub.