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
Está utilizando terribles clases de fecha y hora antiguas que fueron suplantadas hace años por las clases modernas de java.time definidas en JSR 310.
Date
➙ Instant
A java.util.Date
representa un momento en UTC. Su reemplazo es Instant
. Llame a los nuevos métodos de conversión agregados a las clases antiguas.
Instant instant = myJavaUtilDate.toInstant() ;
Zona horaria
Especifique la zona horaria en la que desea que tenga sentido su nueva hora del día.
Especificar un nombre de zona horaria correcta en el formato de Continent/Region
, por ejemplo America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca use el 2-4 abreviatura de letras tales como EST
o IST
, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Aplique el ZoneId
al Instant
para obtener un ZonedDateTime
. Mismo momento, mismo punto en la línea de tiempo, pero diferente hora del reloj de pared.
ZonedDateTime zdt = instant.atZone( z ) ;
Cambiar la hora del día
Pediste cambiar la hora del día. Aplique a LocalTime
para cambiar todas las partes de la hora del día: hora, minuto, segundo, fracción de segundo. Se ZonedDateTime
crea una instancia de un nuevo , con valores basados en el original. Las clases java.time utilizan este patrón de objetos inmutables para proporcionar seguridad para subprocesos .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Primer momento del día
Pero pediste específicamente 00:00. Entonces, aparentemente, quieres el primer momento del día. Atención: algunos días en algunas zonas no comienzan a las 00:00:00. Es posible que comiencen a otra hora, como la 01:00:00, debido a anomalías como el horario de verano (DST).
Deje que java.time determine el primer momento. Extrae la parte de solo fecha. Luego pase la zona horaria para obtener el primer momento.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Ajustar a UTC
Si necesita volver a UTC, extraiga un archivo Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Si necesita java.util.Date
interoperar con un código antiguo que aún no se ha actualizado a java.time , convierta.
java.util.Date d = java.util.Date.from( instant ) ;