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.Date
reprezentują 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/Casablanca
lub Pacific/Auckland
. Nigdy nie używaj skrótów składających się z 2-4 liter, takich jak EST
lub, IST
ponieważ nie są to prawdziwe strefy czasowe, nie są standaryzowane, a nawet nie są unikalne (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Zastosuj ZoneId
do, Instant
aby 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, LocalTime
aby zmienić wszystkie części dotyczące pory dnia: godzina, minuta, sekunda, ułamek sekundy. ZonedDateTime
Tworzony 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.Date
współdziałać ze starym kodem, który nie został jeszcze zaktualizowany do java.time , przekonwertuj.
java.util.Date d = java.util.Date.from( instant ) ;