web-dev-qa-db-fra.com

Comment convertir Instant en LocalDate

J'ai un Instant provenant d'une source qui devrait, selon la spécification, être un LocalDate, mais ne voit aucune méthode dans LocalDate pour la conversion. Quelle est la meilleure façon de procéder?

5
JL Gradley

LocalDate.ofInstant(...); Je crois avoir été ajouté à Java 9.

LocalDateTime a cette méthode en Java 8.

yourInstant.atZone(yourZoneId).toLocalDate(); fonctionnera avec les versions antérieures de LocalDate ...

10
Rob C

Vous devez vous demander à quelle zone de décalage vous souhaitez le transformer le plus probablement et quand vous connaissez la réponse à cette question:

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

MODIFIER

je viens de me rendre compte que cela n’est possible que depuis Java-9, pour une version antérieure à Java9, voir l’autre réponse

3
Eugene

Si vous utilisez Java 8, vous pouvez effectuer les opérations suivantes:

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
2
Robbo_UK

D'autres réponses ont fourni les mécanismes de la transformation, mais je voulais ajouter quelques informations de base sur le sens de cette transformation, ce qui, espérons-le, aide à expliquer pourquoi cela fonctionne comme il fonctionne.


LocalDate et Instant semblent similaires - ils détiennent tous les deux des informations de date (/ heure) sans les informations de fuseau horaire. Cependant, ils ont un sens très différent.

Instant représente un moment précis sans ambiguïté. La représentation ne contient pas explicitement de fuseau horaire, mais elle fait implicitement référence à la ligne horaire UTC.

LocalDateTime (et LocalDate) est ambigu, car il représente un point dans le scénario local , qui fait implicitement référence au fuseau horaire local .

Ainsi, afin de transformer correctement une Instant en une LocalDateTime (conceptuellement - certaines de ces étapes sont regroupées en une seule opération dans la mise en œuvre), vous devez:
1. convertir la Instant en une ZonedDateTime en appliquant les informations de fuseau horaire UTC
2. changer le fuseau horaire en local fuseau horaire (ce qui implique d'ajouter le décalage horaire entre les fuseaux horaires)
3. convertir la ZonedDateTime en une LocalDateTime qui rend le fuseau horaire implicite ( local ) en supprimant les informations de fuseau horaire.

Enfin, vous pouvez supprimer la partie temporelle de LocalDateTime et vous retrouver avec LocalDate.

0