Réponse courte:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Explication: (basé sur cette question concernant LocalDate
)
Malgré son nom, java.util.Date
représente un instant sur la ligne du temps, pas une "date". Les données réelles stockées dans l'objet sont un long
décompte des millisecondes depuis le 1970-01-01T00: 00Z (minuit au début de 1970 GMT / UTC).
La classe équivalente à java.util.Date
JSR-310 est Instant
, il existe donc des méthodes pratiques pour effectuer la conversion de va-et-vient:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
Une java.util.Date
instance n'a pas de concept de fuseau horaire. Cela peut sembler étrange si vous appelez toString()
un java.util.Date
, car le toString
est relatif à un fuseau horaire. Cependant, cette méthode utilise en fait le fuseau horaire par défaut de Java à la volée pour fournir la chaîne. Le fuseau horaire ne fait pas partie de l'état réel de java.util.Date
.
Un Instant
ne contient pas non plus d'informations sur le fuseau horaire. Ainsi, pour convertir d'un Instant
en une date-heure locale, il est nécessaire de spécifier un fuseau horaire. Il peut s'agir du fuseau par défaut - ZoneId.systemDefault()
- ou il peut s'agir d'un fuseau horaire contrôlé par votre application, tel qu'un fuseau horaire issu des préférences de l'utilisateur. LocalDateTime
a une méthode d'usine pratique qui prend à la fois l'instant et le fuseau horaire:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
À l'inverse, le LocalDateTime
fuseau horaire est spécifié en appelant la atZone(ZoneId)
méthode. Le ZonedDateTime
peut ensuite être converti directement en Instant
:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Notez que la conversion de LocalDateTime
à ZonedDateTime
a le potentiel d'introduire un comportement inattendu. En effet, toutes les dates et heures locales n'existent pas en raison de l'heure d'été. En automne / automne, il y a un chevauchement dans la chronologie locale où la même date-heure locale se produit deux fois. Au printemps, il y a un écart, où une heure disparaît. Voir le Javadoc de atZone(ZoneId)
pour plus de définition de ce que fera la conversion.
En résumé, si vous faites un aller-retour entre un et java.util.Date
un LocalDateTime
retour, java.util.Date
vous pouvez vous retrouver avec un instant différent en raison de l'heure d'été.
Informations supplémentaires: Il existe une autre différence qui affectera les dates très anciennes. java.util.Date
utilise un calendrier qui change au 15 octobre 1582, avec des dates antérieures à celles du calendrier julien au lieu du calendrier grégorien. En revanche, java.time.*
utilise le système de calendrier ISO (équivalent au grégorien) pour tous les temps. Dans la plupart des cas d'utilisation, le système de calendrier ISO est ce que vous voulez, mais vous pouvez voir des effets étranges lors de la comparaison des dates avant l'année 1582.