Forkert type
LocalDateTime
er den forkerte type her. Den klasse kan ikke repræsentere et øjeblik, som forklaret i dens Javadoc.
Denne klasse har med vilje ikke noget begreb om tidszone eller offset-fra-UTC. Så det repræsenterer en dato og et tidspunkt på dagen såsom "middag den 23. januar 2019", men ved ikke, om det er middag i Tokyo, Paris eller Montréal, for eksempel tre meget forskellige øjeblikke, der er flere timers mellemrum. Så denne type er passende til standard SQL-typen TIMESTAMP WITHOUT TIME ZONE
– uden , ikke med .
For mere diskussion, se:Hvad er forskellen mellem Instant og LocalDateTime?
Ret type
For standard SQL-type TIMESTAMP WITH TIME ZONE
, bør du bruge Java-typerne Instant
, OffsetDateTime
, eller ZonedDateTime
. Af disse tre kræver JDBC 4.2 kun understøttelse af den anden, OffsetDateTime
.
Hentning.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Værdien hentet fra Postgres vil altid være i UTC. SQL-standarden angiver ikke denne adfærd, så databaser varierer. I Postgres sendes enhver værdi til et felt af typen TIMESTAMP WITH TIME ZONE
justeres til UTC. Hentede værdier er i UTC.
Opbevaring.
myPreparedStatement.setObject( … , odt ) ;
Juster fra UTC (offset af nul) til vægurstiden, der bruges af befolkningen i en bestemt region (en tidszone).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Jeg bruger ikke JPA, og foretrækker at holde tingene enkle.
Men ifølge dette svar , JPA 2.2 understøtter java.time typer.
Hibernate understøtter også java.time .