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
Używasz okropnych starych klas daty i czasu, które lata temu zostały wyparte przez nowoczesne klasy java.time zdefiniowane w JSR 310.
Date ➙ Instant
A java.util.Datereprezentują chwilę w UTC. Jego zamiennikiem jest Instant. Wywołaj nowe metody konwersji dodane do starych klas.
Instant instant = myJavaUtilDate.toInstant() ;
Strefa czasowa
Określ strefę czasową, w której ma mieć sens nowa pora dnia.
Określ prawidłową nazwę strefy czasowej w formacie Continent/Region, takie jak America/Montreal, Africa/Casablancalub Pacific/Auckland. Nigdy nie używaj skrótów składających się z 2-4 liter, takich jak ESTlub, ISTponieważ nie są to prawdziwe strefy czasowe, nie są standaryzowane, a nawet nie są unikalne (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Zastosuj ZoneIddo, Instantaby uzyskać ZonedDateTime. Ten sam moment, ten sam punkt na osi czasu, ale inny zegar ścienny.
ZonedDateTime zdt = instant.atZone( z ) ;
Zmiana pory dnia
Poprosiłeś o zmianę pory dnia. Zastosuj a, LocalTimeaby zmienić wszystkie części dotyczące pory dnia: godzina, minuta, sekunda, ułamek sekundy. ZonedDateTimeTworzony jest nowy egzemplarz z wartościami opartymi na oryginale. W java.time klas użyć tej niezmiennej obiektów wzór, aby zapewnić wątku bezpieczeństwa .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Pierwsza chwila dnia
Ale prosiłeś specjalnie o 00:00. Więc najwyraźniej chcesz pierwszej chwili dnia. Uwaga: niektóre dni w niektórych strefach nie zaczynają się o 00:00:00. Mogą rozpocząć się w innym czasie, na przykład 01:00:00 z powodu anomalii, takich jak czas letni (DST).
Niech java.time określi pierwszy moment. Wyodrębnij część zawierającą tylko datę. Następnie przejdź przez strefę czasową, aby uzyskać pierwszą chwilę.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Dostosuj do UTC
Jeśli chcesz wrócić do UTC, wyodrębnij plik Instant.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant ➙ Date
Jeśli potrzebujesz java.util.Datewspółdziałać ze starym kodem, który nie został jeszcze zaktualizowany do java.time , przekonwertuj.
java.util.Date d = java.util.Date.from( instant ) ;