Fel typ
LocalDateTime
är fel typ här. Den klassen kan inte representera ett ögonblick, som förklaras i dess Javadoc.
Den klassen har avsiktligt inget begrepp om tidszon eller offset-från-UTC. Så det representerar ett datum och en tid på dagen som "middag den 23 januari 2019", men vet inte om det är middag i Tokyo, Paris eller Montréal, till exempel, tre väldigt olika ögonblick som det är flera timmars mellanrum. Så den här typen är lämplig för standard SQL-typ TIMESTAMP WITHOUT TIME ZONE
– utan , inte med .
För mer diskussion, se:Vad är skillnaden mellan Instant och LocalDateTime?
Rätt typ
För standard SQL-typ TIMESTAMP WITH TIME ZONE
, bör du använda Java-typerna Instant
, OffsetDateTime
, eller ZonedDateTime
. Av dessa tre kräver JDBC 4.2 stöd endast för den andra, OffsetDateTime
.
Hämtning.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Värdet som hämtas från Postgres kommer alltid att vara i UTC. SQL-standarden anger inte detta beteende, så databaserna varierar. I Postgres skickas alla värden till ett fält av typen TIMESTAMP WITH TIME ZONE
justeras till UTC. Hämtade värden är i UTC.
Lagring.
myPreparedStatement.setObject( … , odt ) ;
Justera från UTC (offset av noll) till väggklockan som används av människorna i en viss region (en tidszon).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Jag använder inte JPA, föredrar att hålla saker och ting enkla.
Men enligt det här svaret , JPA 2.2 stöder java.time typer.
Hibernate stöder också java.time .