Konverter dato til LocalDate eller LocalDateTime og tilbage

1. Oversigt

Fra og med Java 8 har vi en ny Date API: java.tid.

Men nogle gange er vi stadig nødt til at udføre konverteringer mellem de nye og gamle API'er og arbejde med datorepræsentationer fra begge.

2. Konvertering java.util.Date til java.time.LocalDate

Lad os starte med at konvertere den gamle datorepræsentation til den nye.

Her kan vi drage fordel af et nyttoInstant () metode, som blev føjet til java.util.Date i Java 8.

Når vi konverterer en Øjeblikkeligobjekt, er det nødvendigt at bruge en ZoneId fordiØjeblikkelig objekter er agnostiske i tidszoner - bare punkter på tidslinjen.

Det atZone (ZoneId zone) API fra Øjeblikkelig objekt returnerer a ZonedDateTime, så vi skal bare udtrække LocalDate fra det ved hjælp af toLocalDate () metode.

For det første bruger vi standardsystemet ZoneId:

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

Og en lignende løsning, men med en anden måde at skabe en Øjeblikkelig objekt - bruger afEpochMilli () metode:

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

Før vi går videre, lad os også tage et hurtigt kig på gammel java.sql.dato klasse og hvordan det kan konverteres til en LocalDate såvel.

Fra og med Java 8 kan vi finde en ekstra toLocalDate () metode til java.sql.dato, hvilket også giver os en nem måde at konvertere den til java.time.LocalDate.

I dette tilfælde behøver vi ikke bekymre os om tidszonen:

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

Meget på samme måde kan vi konvertere en gammel Dato objekt i en LocalDateTime objekt også. Lad os se på det næste.

3. Konvertering java.util.Date til java.time.LocalDateTime

For at få en LocalDateTime eksempel kan vi på samme måde bruge en mellemmand ZonedDateTime og brug derefter toLocalDateTime () API.

Ligesom før kan vi bruge to mulige løsninger til at få en Øjeblikkelig objekt fra java.util.Date:

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

Og startende med Java 8, kan vi også brug java.sql.Tidsstempel at få en LocalDateTime:

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

4. Konverter java.time.LocalDate til java.util.Date

Nu hvor vi har en god forståelse af, hvordan vi konverterer fra den gamle datarepræsentation til den nye, lad os se på konvertering i den anden retning.

Vi diskuterer to mulige måder at konvertere på LocalDate til Dato.

I den første bruger vi en ny valueOf (LocalDate dato) metode angivet ijava.sql.dato objekt, som tager LocalDate som parameter:

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

Som vi kan se, er det ubesværet og intuitivt. Det bruger lokal tidszone til konvertering (alt er gjort under emhætten, så du behøver ikke bekymre dig).

I et andet Java 8-eksempel bruger vi en Øjeblikkelig objekt, som vi videregiver til fra (øjeblikkelig øjeblikkelig)metode tiljava.util.Date objekt:

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

Bemærk, at vi bruger en Øjeblikkelig gør indsigelse her, og at vi også skal være opmærksomme på tidszoner, når vi foretager denne konvertering.

Lad os derefter bruge en meget lignende løsning til at konvertere en LocalDateTime til en Dato objekt.

5. Konverter java.time.LocalDateTime til java.util.Date

Den nemmeste måde at få -en java.util.Date fra LocalDateTime er at bruge en udvidelse tiljava.sql.Tidsstempel - tilgængelig med Java 8:

offentlig dato convertToDateViaSqlTimestamp (LocalDateTime dateToConvert) {return java.sql.Timestamp.valueOf (dateToConvert); }

Men selvfølgelig bruger en alternativ løsning en Øjeblikkelig objekt, som vi får fra ZonedDateTime:

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

6. Java 9-tilføjelser

I Java 9 er der nye metoder til rådighed, der forenkler konvertering mellem java.util.Date og java.time.LocalDate eller java.time.LocalDateTime.

LocalDate.ofInstant (Øjeblikkelig øjeblikkelig, ZoneId-zone) og LocalDateTime.ofInstant (Øjeblikkelig øjeblikkelig, ZoneId-zone) give praktiske genveje:

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

7. Konklusion

I denne artikel dækkede vi mulige måder at konvertere gamle på java.util.Date ind i nye java.time.LocalDate og java.time.LocalDateTime, såvel som omvendt.

Den fulde implementering af denne artikel er tilgængelig på GitHub.