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
Stai usando terribili vecchie classi data-ora che sono state soppiantate anni fa dalle moderne classi java.time definite in JSR 310.
Date
➙ Instant
A java.util.Date
rappresenta un momento in UTC. La sua sostituzione è Instant
. Chiama i nuovi metodi di conversione aggiunti alle vecchie classi.
Instant instant = myJavaUtilDate.toInstant() ;
Fuso orario
Specifica il fuso orario in cui desideri che la nuova ora del giorno abbia un senso.
Specificare un nome proprio fuso orario nel formato Continent/Region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non usare mai il 2-4 lettera sigla come ad esempio EST
o IST
come sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Applicare il ZoneId
a Instant
per ottenere un file ZonedDateTime
. Stesso momento, stesso punto sulla timeline, ma diverso tempo dell'orologio da parete.
ZonedDateTime zdt = instant.atZone( z ) ;
Modifica dell'ora del giorno
Hai chiesto di cambiare l'ora del giorno. Applicare a LocalTime
per modificare tutte le parti dell'ora del giorno: ora, minuti, secondi, frazioni di secondo. Viene ZonedDateTime
istanziato un nuovo , con valori basati sull'originale. Le classi java.time utilizzano questo modello di oggetti immutabili per fornire la sicurezza del thread .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Primo momento della giornata
Ma hai chiesto specificatamente per 00:00. Quindi a quanto pare vuoi il primo momento della giornata. Attenzione: alcuni giorni in alcune zone non iniziano alle 00:00:00. Potrebbero iniziare in un altro momento, ad esempio 01:00:00, a causa di anomalie come l'ora legale (DST).
Lascia che java.time determini il primo momento. Estrai la parte di sola data. Quindi passa il fuso orario per ottenere il primo momento.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Regola su UTC
Se devi tornare a UTC, estrai un file Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Se hai bisogno di un java.util.Date
per interagire con il vecchio codice non ancora aggiornato a java.time , converti.
java.util.Date d = java.util.Date.from( instant ) ;