Converti la data in LocalDate o LocalDateTime e viceversa

1. Panoramica

A partire da Java 8, abbiamo una nuova API Date: java.time .

Tuttavia, a volte dobbiamo ancora eseguire conversioni tra le nuove e vecchie API e lavorare con le rappresentazioni della data da entrambe.

2. Conversione di java.util.Date in java.time.LocalDate

Cominciamo con la conversione della vecchia rappresentazione della data in quella nuova.

Qui, possiamo sfruttare un nuovo metodo toInstant () , che è stato aggiunto a java.util.Date in Java 8.

Quando convertiamo un oggetto Instant , è necessario utilizzare uno ZoneId perchéGli oggetti istantanei sono indipendenti dal fuso orario , solo punti sulla sequenza temporale.

L' API atZone (ZoneId zone) dall'oggetto Instant restituisce un ZonedDateTime , quindi è sufficiente estrarre LocalDate da esso utilizzando il metodo toLocalDate () .

Innanzitutto, stiamo utilizzando lo ZoneId di sistema predefinito :

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

E una soluzione simile ma con un modo diverso di creare un oggetto Instant - utilizzando il metodo ofEpochMilli () :

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

Prima di andare avanti, diamo anche una rapida occhiata alla vecchia classe java.sql.Date e come può essere convertita anche in LocalDate .

A partire da Java 8, possiamo trovare un metodo aggiuntivo toLocalDate () su java.sql.Date , che ci offre anche un modo semplice per convertirlo in java.time.LocalDate .

In questo caso, non dobbiamo preoccuparci del fuso orario:

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

In modo molto simile, possiamo convertire anche un vecchio oggetto Date in un oggetto LocalDateTime . Diamo un'occhiata a quello successivo.

3. Conversione di java.util.Date in java.time.LocalDateTime

Per ottenere un'istanza LocalDateTime , possiamo utilizzare in modo simile un ZonedDateTime intermedio e quindi utilizzare l' API toLocalDateTime () .

Proprio come prima, possiamo usare due possibili soluzioni per ottenere un oggetto Instant da 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(); }

E a partire da Java 8, possiamo anche usare java.sql.Timestamp per ottenere un LocalDateTime :

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

4. Convertire java.time.LocalDate in java.util.Date

Ora che abbiamo una buona comprensione di come convertire dalla vecchia rappresentazione dei dati a quella nuova, diamo un'occhiata alla conversione nell'altra direzione.

Discuteremo due possibili modi per convertire LocalDate in Date .

Nel primo, utilizziamo un nuovo metodo valueOf (LocalDate date) fornito nell'oggetto java.sql.Date , che accetta LocalDate come parametro:

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

Come possiamo vedere, è semplice e intuitivo. Utilizza il fuso orario locale per la conversione (tutto viene fatto sotto il cofano, quindi non c'è bisogno di preoccuparsi).

In un altro esempio di Java 8, utilizziamo un oggetto Instant che passiamo al metodo from (Instant instant) dell'oggetto java.util.Date :

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

Notare che qui utilizziamo un oggetto Instant e che dobbiamo anche preoccuparci dei fusi orari quando eseguiamo questa conversione.

Successivamente, utilizziamo una soluzione molto simile per convertire un LocalDateTime in un oggetto Date .

5. Convertire java.time.LocalDateTime in java.util.Date

Il modo più facile di ottenere un java.util.Date da LocalDateTime è quello di utilizzare una proroga per il java.sql.Timestamp - disponibili con Java 8:

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

Ma ovviamente, una soluzione alternativa sta usando un oggetto Instant , che otteniamo da ZonedDateTime :

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

6. Aggiunte a Java 9

In Java 9, sono disponibili nuovi metodi che semplificano la conversione tra java.util.Date e java.time.LocalDate o java.time.LocalDateTime .

LocalDate.ofInstant (Instant instant, ZoneId zone) e LocalDateTime.ofInstant (Instant instant, ZoneId zone) forniscono comode scorciatoie:

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

In questo articolo, abbiamo coperto i possibili modi per convertire il vecchio java.util.Date in nuovi java.time.LocalDate e java.time.LocalDateTime , così come il contrario.

L'implementazione completa di questo articolo è disponibile su GitHub.