Tipo errado
LocalDateTime
é o tipo errado aqui. Essa classe não pode representar um momento, conforme explicado em seu Javadoc. Essa classe propositalmente não tem conceito de fuso horário ou deslocamento do UTC. Portanto, representa uma data e uma hora do dia como “meio-dia de 23 de janeiro de 2019”, mas não sei se é meio-dia em Tóquio, Paris ou Montreal, por exemplo, três momentos muito diferentes que são várias horas de intervalo. Portanto, este tipo é apropriado para o tipo SQL padrão
TIMESTAMP WITHOUT TIME ZONE
– sem , não com . Para mais discussões, consulte:Qual é a diferença entre Instant e LocalDateTime?
Tipo certo
Para o tipo SQL padrão
TIMESTAMP WITH TIME ZONE
, você deve usar os tipos Java Instant
, OffsetDateTime
, ou ZonedDateTime
. Desses três, o JDBC 4.2 requer suporte apenas para o segundo, OffsetDateTime
. Recuperação.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
O valor recuperado do Postgres sempre estará em UTC. O padrão SQL não especifica esse comportamento, portanto, os bancos de dados variam. No Postgres qualquer valor enviado para um campo do tipo
TIMESTAMP WITH TIME ZONE
é ajustado para UTC. Os valores recuperados estão em UTC. Armazenamento.
myPreparedStatement.setObject( … , odt ) ;
Ajuste de UTC (deslocamento de zero) para a hora do relógio de parede usada pelas pessoas de uma determinada região (um fuso horário).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Eu não uso JPA, preferindo manter as coisas simples.
Mas de acordo com esta resposta , JPA 2.2 suporta o java.time tipos.
O Hibernate também suporta java.time .