Marca de tiempo
extiende Date
para proporcionar una precisión de nanosegundos. Ni Date
ni Timestamp
están diseñados para referirse a una zona horaria específica como ZoneDateTime
.
Si necesita convertir ZonedDateTime
-> Timestamp
tendrá que descartar la información de zona horaria/compensación. Por ejemplo
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
y para convertir Timestamp
-> ZonedDateTime
necesita especificar un desplazamiento:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
o zona horaria:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Si su intención es guardar ZonedDateTime
variables en la base de datos y preservar las diversas zonas horarias especificadas allí, recomiendo diseñar su base de datos en consecuencia. Sugerencias:
- Utilice una columna de tipo
DATETIME
para guardar unLocalDateTime
y unVARCHAR
guardar una zona horaria como"Europe/Paris"
o unSMALLINT
guardar una compensación en minutos. - Convertir el
ZonedDateTime
a unaString
y guardar en unVARCHAR
columna como"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Luego tendrá que analizarlo cuando lea de la base de datos.