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.