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
Você está usando classes terríveis de data e hora que foram suplantadas anos atrás pelas classes java.time modernas definidas no JSR 310.
Date
➙ Instant
A java.util.Date
representa um momento no UTC. Sua substituição é Instant
. Chame os novos métodos de conversão adicionados às classes antigas.
Instant instant = myJavaUtilDate.toInstant() ;
Fuso horário
Especifique o fuso horário no qual deseja que a nova hora do dia faça sentido.
Especifique um nome próprio fuso horário no formato Continent/Region
, como America/Montreal
, Africa/Casablanca
, ou Pacific/Auckland
. Nunca use o 2-4 letras, como EST
ou IST
como eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Aplique o ZoneId
ao Instant
para obter um ZonedDateTime
. Mesmo momento, mesmo ponto na linha do tempo, mas com um relógio de parede diferente.
ZonedDateTime zdt = instant.atZone( z ) ;
Mudando a hora do dia
Você pediu para alterar a hora do dia. Aplique a LocalTime
para alterar todas as partes da hora do dia: hora, minuto, segundo, segundo fracionário. Um novo ZonedDateTime
é instanciado, com valores baseados no original. As classes java.time usam esse padrão de objetos imutáveis para fornecer segurança de thread .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Primeiro momento do dia
Mas você pediu especificamente para 00:00. Então, aparentemente, você quer o primeiro momento do dia. Cuidado: alguns dias em algumas zonas não começam às 00:00:00. Eles podem iniciar em outro horário, como 01:00:00 devido a anomalias como horário de verão (DST).
Deixe java.time determinar o primeiro momento. Extraia a parte apenas da data. Em seguida, passe o fuso horário para obter o primeiro momento.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Ajustar para UTC
Se você precisar voltar ao UTC, extraia um Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Se você precisar java.util.Date
interoperar com o código antigo ainda não atualizado para java.time , converta.
java.util.Date d = java.util.Date.from( instant ) ;