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
Sie verwenden schreckliche alte Datums- / Uhrzeitklassen , die vor Jahren durch die in JSR 310 definierten modernen java.time- Klassen ersetzt wurden.
Date
➙ Instant
A java.util.Date
repräsentiert einen Moment in UTC. Sein Ersatz ist Instant
. Rufen Sie die neuen Konvertierungsmethoden auf, die den alten Klassen hinzugefügt wurden.
Instant instant = myJavaUtilDate.toInstant() ;
Zeitzone
Geben Sie die Zeitzone an, in der Ihre neue Tageszeit sinnvoll sein soll.
Geben Sie einen richtigen Zeitzonennamen im Format Continent/Region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 2-4 Buchstaben, wie z. B. EST
oder, IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Wenden Sie das ZoneId
an Instant
, um eine zu erhalten ZonedDateTime
. Gleicher Moment, gleicher Punkt auf der Zeitachse, aber andere Wanduhrzeit.
ZonedDateTime zdt = instant.atZone( z ) ;
Tageszeit ändern
Sie haben darum gebeten, die Tageszeit zu ändern. Wenden Sie a LocalTime
an, um alle Tageszeitteile zu ändern: Stunde, Minute, Sekunde, Bruchteil einer Sekunde. Ein neues ZonedDateTime
wird instanziiert, wobei die Werte auf dem Original basieren. Die java.time- Klassen verwenden dieses unveränderliche Objektmuster , um Thread-Sicherheit zu gewährleisten .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Erster Moment des Tages
Aber Sie haben speziell nach 00:00 gefragt. Anscheinend wollen Sie also den ersten Moment des Tages. Achtung: Einige Tage in einigen Zonen beginnen nicht um 00:00:00 Uhr. Sie können aufgrund von Anomalien wie der Sommerzeit (DST) zu einem anderen Zeitpunkt wie z. B. 01:00:00 Uhr beginnen.
Lassen Sie java.time den ersten Moment bestimmen. Extrahieren Sie den Nur-Datum-Teil. Übergeben Sie dann die Zeitzone, um den ersten Moment zu erhalten.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Auf UTC einstellen
Wenn Sie zu UTC zurückkehren müssen, extrahieren Sie eine Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Wenn Sie einen benötigen java.util.Date
, um mit altem Code zusammenzuarbeiten, der noch nicht auf java.time aktualisiert wurde , konvertieren Sie.
java.util.Date d = java.util.Date.from( instant ) ;