Preveďte dátum na LocalDate alebo LocalDateTime a späť

1. Prehľad

Počnúc jazykom Java 8 máme nové rozhranie Date API: java.time.

Niekedy však stále musíme vykonať konverzie medzi novým a starým rozhraním API a pracovať s reprezentáciami dátumov z oboch.

2. Konvertovanie java.util.Date do java.time.LocalDate

Začnime prevodom starej reprezentácie dátumu na novú.

Tu môžeme využiť výhodu novéhotoInstant () metóda, ktorá bola pridaná k java.util.Date v prostredí Java 8.

Keď prevádzame Okamžitéobjektu, je potrebné použiť a ZoneId pretožeOkamžité objekty sú časové pásmo agnostické - iba body na časovej osi.

The atZone (zóna ZoneId) API z Okamžité objekt vráti a ZonedDateTime, takže musíme iba extrahovať LocalDate z neho pomocou toLocalDate () metóda.

Najprv používame predvolený systém ZoneId:

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

A podobné riešenie, ale s iným spôsobom vytvorenia súboru Okamžité objekt - pomocou ofEpochMilli () metóda:

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

Než prejdeme ďalej, poďme sa tiež rýchlo pozrieť na starý java.sql.Date triedy a ako sa to dá previesť na a LocalDate tiež.

Počnúc jazykom Java 8 môžeme nájsť ďalší toLocalDate () metóda na java.sql.Date, čo nám tiež umožňuje ľahký spôsob konverzie na java.time.LocalDate.

V takom prípade si nemusíme robiť starosti s časovým pásmom:

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

Veľmi podobne môžeme previesť starý Dátum objekt do a LocalDateTime objekt tiež. Pozrime sa na to ďalej.

3. Konvertovanie java.util.Date do java.time.LocalDateTime

Ak chcete získať LocalDateTime napríklad môžeme použiť podobne sprostredkovateľ ZonedDateTime a potom použite toLocalDateTime () API.

Rovnako ako predtým môžeme získať dve možné riešenia Okamžité objekt z 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 (); }

A počnúc jazykom Java 8, môžeme tiež použitie java.sql.Timestamp získať a LocalDateTime:

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

4. Konvertovať java.time.LocalDate do java.util.Date

Teraz, keď dobre rozumieme tomu, ako prevádzať zo starej reprezentácie údajov na novú, poďme sa pozrieť na prevod opačným smerom.

Budeme diskutovať o dvoch možných spôsoboch konverzie LocalDate do Dátum.

V prvej používame novú valueOf (LocalDate date) metóda uvedená vjava.sql.Date objekt, ktorý berie LocalDate ako parameter:

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

Ako vidíme, je to jednoduché a intuitívne. Na prevod využíva miestne časové pásmo (všetko sa deje pod kapotou, takže sa nemusíte obávať).

V ďalšom príklade Java 8 používame znak Okamžité objekt, ktorý odovzdáme z (okamžité okamžité)metódajava.util.Date objekt:

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

Všimnite si, že používame Okamžité objekt a že pri tejto konverzii nám tiež musí záležať na časových pásmach.

Ďalej použijeme veľmi podobné riešenie na prevod a LocalDateTime do a Dátum objekt.

5. Konvertovať java.time.LocalDateTime do java.util.Date

Najjednoduchší spôsob získania a java.util.Date od LocalDateTime je použitie rozšírenia kjava.sql.Timestamp - k dispozícii v prostredí Java 8:

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

Ale samozrejme sa používa alternatívne riešenie an Okamžité objekt, od ktorého získavame ZonedDateTime:

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

6. Doplnky Java 9

V prostredí Java 9 sú k dispozícii nové metódy, ktoré zjednodušujú konverziu medzi nimi java.util.Date a java.time.LocalDate alebo java.time.LocalDateTime.

LocalDate.ofInstant (okamžitý okamih, zóna ZoneId) a LocalDateTime.ofInstant (okamžitý okamih, zóna ZoneId) poskytnite užitočné skratky:

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. Záver

V tomto článku sme sa zaoberali možnými spôsobmi premeny starých java.util.Date do nového java.time.LocalDate a java.time.LocalDateTime, ako aj naopak.

Plná implementácia tohto článku je k dispozícii na GitHub.


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