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.Datereprésente un instant sur la ligne du temps, pas une "date". Les données réelles stockées dans l'objet sont un longdécompte des millisecondes depuis le 1970-01-01T00: 00Z (minuit au début de 1970 GMT / UTC).
La classe équivalente à java.util.DateJSR-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.Dateinstance n'a pas de concept de fuseau horaire. Cela peut sembler étrange si vous appelez toString()un java.util.Date, car le toStringest 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 Instantne contient pas non plus d'informations sur le fuseau horaire. Ainsi, pour convertir d'un Instanten 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. LocalDateTimea 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 LocalDateTimefuseau horaire est spécifié en appelant la atZone(ZoneId)méthode. Le ZonedDateTimepeut 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à ZonedDateTimea 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.Dateun LocalDateTimeretour, java.util.Datevous 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.Dateutilise 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.