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?
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 ...
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
Si vous utilisez Java 8, vous pouvez effectuer les opérations suivantes:
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
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
.