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.

user1643352
la source
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

JodaStephen
la source
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)
mdo
la source
Merci beaucoup. Je comprends maintenant que je dois spécifier un fuseau horaire pour obtenir un instantané.
user1643352