Konverter dato til LocalDate eller LocalDateTime og Back

1. Oversikt

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

Noen ganger trenger vi likevel å utføre konverteringer mellom de nye og gamle API-ene, og jobbe med datorepresentasjoner fra begge.

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

La oss starte med å konvertere den gamle datorepresentasjonen til den nye.

Her kan vi dra nytte av en nytoInstant () metode, som ble lagt til java.util.Date i Java 8.

Når vi konverterer en Umiddelbarobjekt, er det nødvendig å bruke en ZoneId fordiUmiddelbar objekter er tidssone agnostiske - bare poeng på tidslinjen.

De atZone (ZoneId sone) API fra Umiddelbar objektet returnerer a ZonedDateTime, så vi trenger bare å pakke ut LocalDate fra det ved hjelp av toLocalDate () metode.

Først bruker vi standardsystemet ZoneId:

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

Og en lignende løsning, men med en annen måte å skape en Umiddelbar gjenstand - bruker avEpochMilli () metode:

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

Før vi går videre, la oss også ta en rask titt på gammel java.sql.dato klasse og hvordan det kan konverteres til en LocalDate også.

Fra og med Java 8, kan vi finne en ekstra toLocalDate () metode på java.sql.dato, som også gir oss en enkel måte å konvertere den til java.time.LocalDate.

I dette tilfellet trenger vi ikke bekymre oss for tidssonen:

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

På samme måte kan vi konvertere en gammel Dato objekt i en LocalDateTime objekt også. La oss se på det neste.

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

For å få en LocalDateTime for eksempel kan vi på samme måte bruke en mellommann ZonedDateTime og bruk deretter toLocalDateTime () API.

Akkurat som før kan vi bruke to mulige løsninger for å få en Umiddelbar objekt fra java.util.Date:

public 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 fra og med Java 8, kan vi også bruk java.sql.Tidsstempel for å få en LocalDateTime:

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

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

Nå som vi har god forståelse av hvordan vi konverterer fra den gamle datarepresentasjonen til den nye, la oss ta en titt på konvertering i den andre retningen.

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

I den første bruker vi en ny valueOf (LocalDate dato) metoden gitt ijava.sql.dato objekt, som tar LocalDate som parameter:

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

Som vi kan se, er det uanstrengt og intuitivt. Den bruker lokal tidssone for konvertering (alt er gjort under panseret, så ingen grunn til bekymring).

I et annet Java 8-eksempel bruker vi en Umiddelbar objekt som vi overfører til fra (Øyeblikkelig øyeblikk)Metode avjava.util.Date gjenstand:

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

Legg merke til at vi bruker en Umiddelbar innvende her og at vi også trenger å bry oss om tidssoner når vi gjør denne konverteringen.

La oss deretter bruke en veldig lignende løsning for å konvertere en LocalDateTime til en Dato gjenstand.

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

Den enkleste måten å komme seg på en java.util.Date fra LocalDateTime er å bruke en utvidelse tiljava.sql.Tidsstempel - tilgjengelig med Java 8:

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

Men selvfølgelig bruker en alternativ løsning en Umiddelbar objekt, som vi får fra ZonedDateTime:

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

6. Java 9-tillegg

I Java 9 er det nye metoder tilgjengelig som forenkler konvertering mellom java.util.Date og java.time.LocalDate eller java.time.LocalDateTime.

LocalDate.ofInstant (Øyeblikkelig øyeblikk, ZoneId-sone) og LocalDateTime.ofInstant (Øyeblikkelig øyeblikk, ZoneId-sone) gi praktiske snarveier:

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

I denne artikkelen tok vi for oss mulige måter å konvertere gamle på java.util.Date inn i nytt java.time.LocalDate og java.time.LocalDateTime, så vel som omvendt.

Den fulle implementeringen av denne artikkelen er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found