Comment convertir une LocalDate en Instant?


106

Je travaille avec la nouvelle API DateTime de Java 8.

Comment convertir une LocalDate en Instant? Je reçois une exception avec

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

et je ne comprends pas pourquoi.


Parce que a LocalDaten'inclut pas de temps.
OrangeDog

Réponses:


98

La Instantclasse représente un point instantané sur la ligne du temps. La conversion vers et depuis a LocalDatenécessite un fuseau horaire. Contrairement à d'autres bibliothèques de date et d'heure, le JSR-310 ne sélectionnera pas automatiquement le fuseau horaire pour vous, vous devez donc le fournir.

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

Cet exemple utilise le fuseau horaire par défaut de la JVM - ZoneId.systemDefault()- pour effectuer la conversion. Voir ici pour une réponse plus longue à une question connexe.


Mise à jour: La réponse acceptée utilise LocalDateTime::toInstant(ZoneOffset)qui accepte uniquement ZoneOffset. Cette réponse utilise LocalDate::atStartOfDay(ZoneId)qui accepte tout ZoneId. En tant que telle, cette réponse est généralement plus utile (et devrait probablement être celle acceptée).

PS. J'étais l'auteur principal de l'API


1
Je pense que c'est la réponse la plus utile que la réponse acceptée puisque ZoneId (fuseau horaire) est le paramètre et non ZoneOffset (heures décalées de UTC, qui peuvent changer pour un fuseau horaire en été / hiver).
wuerg

1
Dans un test unitaire que j'écris, j'ai un LocalDate, qui est converti en com.google.protobuf.Timestamp puis mappé à un LocalDate via un instant, dans les deux sens. Lorsque j'utilise l'approche suggérée par la réponse acceptée, j'obtiens la LocalDate attendue en retour, mais en utilisant cette approche, je reviens "hier" au lieu de "aujourd'hui". Mon fuseau horaire est GMT + 1
Nadrendion

127

Pour le convertir en un instant, vous devez avoir une instance LocalDateTime, par exemple:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

Merci beaucoup. Je comprends maintenant que je dois spécifier un fuseau horaire pour obtenir un instantané.
user1643352
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.