sql >> Base de Datos >  >> RDS >> Mysql

LocalDateTime , ZonedDateTime y Marca de tiempo

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:

  1. Utilice una columna de tipo DATETIME para guardar un LocalDateTime y un VARCHAR guardar una zona horaria como "Europe/Paris" o un SMALLINT guardar una compensación en minutos.
  2. Convertir el ZonedDateTime a una String y guardar en un VARCHAR columna como "2017-05-16T14:12:48.983682+01:00[Europe/London]" . Luego tendrá que analizarlo cuando lea de la base de datos.