Convertir la date en LocalDate ou LocalDateTime et inversement

1. Vue d'ensemble

À partir de Java 8, nous avons une nouvelle API de date: java.time .

Cependant, nous devons parfois encore effectuer des conversions entre les nouvelles et anciennes API et travailler avec des représentations de date des deux.

2. Conversion de java.util.Date en java.time.LocalDate

Commençons par convertir l'ancienne représentation de date en la nouvelle.

Ici, nous pouvons profiter d'une nouvelle méthode toInstant () , qui a été ajoutée à java.util.Date dans Java 8.

Lorsque nous convertissons un objet Instant , il est nécessaire d'utiliser un ZoneId carLes objets instantanés sont indépendants du fuseau horaire - juste des points sur la chronologie.

L' API atZone (ZoneId zone) de l' objet Instant renvoie un ZonedDateTime , il nous suffit donc d'en extraire LocalDate à l'aide de la méthode toLocalDate () .

Tout d'abord, nous utilisons le système par défaut ZoneId :

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

Et une solution similaire mais avec une manière différente de créer un objet Instant - en utilisant la méthode ofEpochMilli () :

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

Avant de poursuivre, jetons également un coup d'œil à l' ancienne classe java.sql.Date et comment elle peut également être convertie en LocalDate .

À partir de Java 8, nous pouvons trouver une méthode toLocalDate () supplémentaire sur java.sql.Date , qui nous donne également un moyen facile de la convertir en java.time.LocalDate .

Dans ce cas, nous n'avons pas à nous soucier du fuseau horaire:

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

De la même manière, nous pouvons également convertir un ancien objet Date en un objet LocalDateTime . Jetons un coup d'œil à cela ensuite.

3. Conversion de java.util.Date en java.time.LocalDateTime

Pour obtenir une instance LocalDateTime , nous pouvons de la même manière utiliser un intermédiaire ZonedDateTime , puis utiliser l' API toLocalDateTime () .

Tout comme avant, nous pouvons utiliser deux solutions possibles pour obtenir un objet Instant à partir de 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(); }

Et à partir de Java 8, nous pouvons également utiliser java.sql.Timestamp pour obtenir un LocalDateTime :

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

4. Convertissez java.time.LocalDate en java.util.Date

Maintenant que nous avons une bonne compréhension de la conversion de l'ancienne représentation de données à la nouvelle, jetons un œil à la conversion dans l'autre sens.

Nous discuterons de deux manières possibles de convertir LocalDate en Date .

Dans le premier, nous utilisons une nouvelle méthode valueOf (LocalDate date) fournie dans l' objet java.sql.Date , qui prend LocalDate comme paramètre:

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

Comme nous pouvons le voir, il est simple et intuitif. Il utilise le fuseau horaire local pour la conversion (tout se fait sous le capot, donc pas de souci).

Dans un autre exemple Java 8, nous utilisons un objet Instant que nous transmettons à la méthode from (Instant instant) de l' objet java.util.Date :

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

Notez que nous utilisons ici un objet Instant et que nous devons également nous soucier des fuseaux horaires lors de cette conversion.

Ensuite, utilisons une solution très similaire pour convertir un LocalDateTime en objet Date .

5. Convertissez java.time.LocalDateTime en java.util.Date

Le moyen le plus simple d'obtenir un java.util.Date à partir de LocalDateTime est d'utiliser une extension de java.sql.Timestamp - disponible avec Java 8:

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

Mais bien sûr, une solution alternative consiste à utiliser un objet Instant , que nous obtenons de ZonedDateTime :

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

6. Ajouts Java 9

Dans Java 9, de nouvelles méthodes simplifient la conversion entre java.util.Date et java.time.LocalDate ou java.time.LocalDateTime .

LocalDate.ofInstant (Instant instant, zone ZoneId) et LocalDateTime.ofInstant (Instant instant, zone ZoneId) fournissent des raccourcis pratiques:

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

Dans cet article, nous avons couvert les moyens possibles de convertir l'ancien java.util.Date en nouveaux java.time.LocalDate et java.time.LocalDateTime , ainsi que l'inverse.

L'implémentation complète de cet article est disponible à l'adresse over sur GitHub.