Tipo incorrecto
LocalDateTime
es el tipo incorrecto aquí. Esa clase no puede representar un momento, como se explica en su Javadoc.
Esa clase deliberadamente no tiene concepto de zona horaria o desplazamiento desde UTC. Entonces representa una fecha y una hora del día como “el mediodía del 23 de enero de 2019”, pero no sé si eso es mediodía en Tokio, París o Montreal, por ejemplo, tres momentos muy diferentes que son varias horas de diferencia. Por lo tanto, este tipo es apropiado para el tipo de SQL estándar TIMESTAMP WITHOUT TIME ZONE
– sin , no con .
Para obtener más información, consulte:¿Cuál es la diferencia entre Instant y LocalDateTime?
Tipo correcto
Para SQL estándar, escriba TIMESTAMP WITH TIME ZONE
, debería usar los tipos de Java Instant
, OffsetDateTime
o ZonedDateTime
. De esos tres, JDBC 4.2 requiere soporte solo para el segundo, OffsetDateTime
.
Recuperación.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
El valor recuperado de Postgres siempre estará en UTC. El estándar SQL no especifica este comportamiento, por lo que las bases de datos varían. En Postgres, cualquier valor enviado a un campo de tipo TIMESTAMP WITH TIME ZONE
se ajusta a UTC. Los valores recuperados están en UTC.
almacenar
myPreparedStatement.setObject( … , odt ) ;
Ajuste desde UTC (compensación de cero) a la hora del reloj de pared utilizada por las personas de una región en particular (una zona horaria).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
No uso JPA, prefiero mantener las cosas simples.
Pero según esta respuesta , JPA 2.2 admite java.time tipos.
Hibernate también es compatible con java.time .