Pretvori datum u LocalDate ili LocalDateTime i Natrag

1. Pregled

Počevši od Jave 8, imamo novi API za datum: java.vrijeme.

Međutim, ponekad još uvijek moramo izvršiti pretvorbu između novog i starog API-ja i raditi s prikazima datuma iz oba.

2. Pretvaranje java.util.Datum do java.time.LocalDate

Počnimo s pretvaranjem starog prikaza datuma u novi.

Ovdje možemo iskoristiti novotoInstant () metoda koja je dodana u java.util.Datum u Javi 8.

Kada pretvaramo Trenutakobjekt, potrebno je koristiti a ZoneId jerTrenutak objekti su agnostički u vremenskoj zoni - samo bodovi na vremenskoj traci.

The atZone (ZoneId zona) API od Trenutak objekt vraća a ZonedDateTime, tako da samo trebamo izdvojiti LocalDate iz njega pomoću toLocalDate () metoda.

Prvo, koristimo zadani sustav ZoneId:

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

I slično rješenje, ali s drugačijim načinom stvaranja Trenutak objekt - koristiti ofEpochMilli () metoda:

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

Prije nego što nastavimo, hajde da također na brzinu pogledamo star java.sql.Date klase i kako se to može pretvoriti u LocalDate također.

Počevši od Jave 8, možemo pronaći dodatnu toLocalDate () metoda na java.sql.Date, što nam također daje jednostavan način pretvaranja u java.time.LocalDate.

U ovom slučaju ne trebamo brinuti o vremenskoj zoni:

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

Vrlo slično možemo pretvoriti staru Datum objekt u a LocalDateTime objekt također. Pogledajmo to dalje.

3. Pretvaranje java.util.Datum do java.time.LocalDateTime

Da biste dobili LocalDateTime primjerice, možemo slično koristiti posrednik ZonedDateTime a zatim upotrijebite toLocalDateTime () API.

Kao i prije, za dobivanje datoteke možemo koristiti dva moguća rješenja Trenutak objekt od java.util.Datum:

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

A počevši od Jave 8, također možemo koristiti java.sql.Timestamp dobiti a LocalDateTime:

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

4. Pretvori java.time.LocalDate do java.util.Datum

Sad kad smo dobro razumjeli kako pretvoriti iz starog prikaza podataka u novi, pogledajmo pretvaranje u drugom smjeru.

Razgovarat ćemo o dva moguća načina pretvorbe LocalDate do Datum.

U prvom koristimo novi valueOf (datum lokalnog datuma) metoda predviđena ujava.sql.Date objekt, koji traje LocalDate kao parametar:

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

Kao što vidimo, jednostavan je i intuitivan. Za pretvorbu koristi lokalnu vremensku zonu (sve se radi ispod haube, tako da ne morate brinuti).

U drugom primjeru Java 8 koristimo Trenutak objekt koji prosljeđujemo na od (trenutno instant)metodajava.util.Datum objekt:

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

Primijetimo da koristimo Trenutak prigovaramo ovdje i da također trebamo voditi računa o vremenskim zonama prilikom ove konverzije.

Dalje, upotrijebimo vrlo slično rješenje za pretvorbu a LocalDateTime do a Datum objekt.

5. Pretvori java.time.LocalDateTime do java.util.Datum

Najlakši način dobivanja a java.util.Datum iz LocalDateTime je korištenje proširenja zajava.sql.Timestamp - dostupno s Javom 8:

javni datum convertToDateViaSqlTimestamp (LocalDateTime dateToConvert) {return java.sql.Timestamp.valueOf (dateToConvert); }

Ali naravno, koristi se alternativno rješenje an Trenutak objekt, koji dobivamo od ZonedDateTime:

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

6. Java 9 Dodaci

U Javi 9 dostupne su nove metode koje pojednostavljuju pretvorbu između java.util.Datum i java.time.LocalDate ili java.time.LocalDateTime.

LocalDate.ofInstant (Instant instant, ZoneId zona) i LocalDateTime.ofInstant (Instant instant, ZoneId zona) pružiti zgodne prečace:

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

7. Zaključak

U ovom smo članku pokrili moguće načine pretvaranja starih java.util.Datum u novo java.time.LocalDate i java.time.LocalDateTime, kao i obrnuto.

Potpuna implementacija ovog članka dostupna je na GitHubu.