tl; dr
myJavaUtilDate // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant() // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate() // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) ) // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.
java.time
Vous utilisez de terribles vieilles classes date-heure qui ont été supplantées il y a des années par les classes java.time modernes définies dans JSR 310.
Date
➙ Instant
A java.util.Date
représente un moment UTC. Son remplacement est Instant
. Appelez les nouvelles méthodes de conversion ajoutées aux anciennes classes.
Instant instant = myJavaUtilDate.toInstant() ;
Fuseau horaire
Spécifiez le fuseau horaire dans lequel vous souhaitez que votre nouvelle heure ait du sens.
Indiquez un nom de fuseau horaire approprié dans le format Continent/Region
, tels que America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 2 à 4 lettres comme EST
ou IST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!)
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Appliquez le ZoneId
pour Instant
obtenir un ZonedDateTime
. Même moment, même point sur la chronologie, mais heure d'horloge murale différente.
ZonedDateTime zdt = instant.atZone( z ) ;
Changement d'heure
Vous avez demandé à changer l'heure de la journée. Appliquer a LocalTime
pour changer toutes les parties de l'heure: heure, minute, seconde, fraction de seconde. Un nouveau ZonedDateTime
est instancié, avec des valeurs basées sur l'original. Les classes java.time utilisent ce modèle d' objets immuables pour assurer la sécurité des threads .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Premier moment de la journée
Mais vous avez demandé spécifiquement 00h00. Donc, apparemment, vous voulez le premier moment de la journée. Attention: certains jours dans certaines zones ne commencent pas à 00h00. Ils peuvent démarrer à une autre heure telle que 01:00:00 en raison d'anomalies telles que l'heure d'été (DST).
Laissez java.time déterminer le premier moment. Extrayez la partie datée uniquement. Passez ensuite le fuseau horaire pour obtenir le premier moment.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Ajuster à UTC
Si vous devez revenir à UTC, extrayez un fichier Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Si vous avez besoin d'un java.util.Date
pour interagir avec l'ancien code pas encore mis à jour vers java.time , convertissez.
java.util.Date d = java.util.Date.from( instant ) ;