Convertir la date en heure locale ou locale

Convertir Date en LocalDate ou LocalDateTime et Retour

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 la nouvelle et l'ancienne API et utiliser les représentations de date des deux.

Lectures complémentaires:

Migration vers la nouvelle API Java 8 Date Time

Un guide rapide et pratique sur la transition vers la nouvelle API DateTime de Java 8.

Read more

Introduction à l'API Java 8 Date / Time

Dans cet article, nous allons examiner les nouvelles API Java 8 pour la date et l'heure et voir à quel point il est plus facile de construire et de manipuler des dates et des heures.

Read more

2. Conversion dejava.util.Date enjava.time.LocalDate

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

Ici, nous pouvons profiter d'un nouveautoInstant() method which was added to java.util.Date en Java 8.

Lorsque nous convertissons unInstantobject, it’s required to use a ZoneId, because _ _Instant objects are timezone-agnostic - ne pointe que sur la chronologie.

L'APIatZone(ZoneId zone) de l'objetInstant renvoie unZonedDateTime donc nous avons juste besoin d'en extraireLocalDate en utilisant la méthodetoLocalDate().

Dans notre premier exemple ici, nous utilisons le système par défautZoneId:

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

A similar solution to the above one, but with a different way of creating an Instant object - en utilisant la méthodeofEpochMilli():

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

Avant de continuer, jetons également un coup d'œil à la classeold java.sql.Date et comment elle peut également être convertie enLocalDate.

À partir de Java 8, nous pouvons trouver une méthodetoLocalDate() supplémentaire surjava.sql.Date - ce qui nous donne également un moyen facile de la convertir enjava.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 l'ancien objetDate en un objetLocalDateTime - voyons cela ensuite.

3. Conversion dejava.util.Date enjava.time.LocalDateTime

Pour obtenir une instance deLocalDateTime, nous pouvons également utiliseran intermediary ZonedDateTime, and then using the toLocalDateTime() API.

Tout comme avant, nous pouvons utiliser deux solutions possibles pour obtenir un objetInstant à partir dejava.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 égalementuse java.sql.Timestamp to obtain a LocalDateTime:

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

4. Convertirjava.time.LocalDate enjava.util.Date

Maintenant que nous avons une bonne compréhension de la conversion de l'ancienne représentation de données vers la nouvelle, examinons la conversion dans l'autre sens.

Nous allons discuter de deux manières possibles de convertirLocalDate enDate.

Dans le premier, nous utilisons un nouvel objetvalueOf(LocalDate date) method provided injava.sql.Date qui prendLocalDate comme paramètre:

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

Comme on peut le constater, il s’agit d’un processus sans effort et intuitif. Il utilise le fuseau horaire local pour la conversion (tout est fait sous le capot, pas de panique).

Dans un autre exemple, Java 8, nous utilisons un objetInstant que nous passons à l'objetfrom(Instant instant)method ofjava.util.Date:

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

Vous remarquerez que nous utilisons ici un objetInstant et que nous devons également nous soucier des fuseaux horaires lors de cette conversion.

Ensuite, utilisons des solutions très similaires pour convertir unLocalDateTime en un objetDate.

5. Convertirjava.time.LocalDateTime enjava.util.Date

Le moyen le plus simple d'obtenira java.util.Date from LocalDateTime is to use an extension to thejava.sql.Timestamp - disponible avec Java 8:

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

Mais bien sûr, une solution alternative utilisean Instant object – which we obtain from ZonedDateTime:

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

6. Ajouts Java 9

Dans Java 9, il existe de nouvelles méthodes disponibles qui simplifient la conversion entrejava.util.Date etjava.time.LocalDate oujava.time.LocalDateTime.

LocalDate.ofInstant(Instant instant, ZoneId zone) etLocalDateTime.ofInstant(Instant instant, ZoneId zone) 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 ce didacticiel, nous avons couvert les moyens possibles de convertir les anciensjava.util.Date en nouveauxjava.time.LocalDate etjava.time.LocalDateTime et une autre façon de contourner.

L'implémentation complète de cet article est disponibleover on Github.