Špatný typ
LocalDateTime
je zde špatný typ. Tato třída nemůže představovat okamžik, jak je vysvětleno v jejím Javadoc.
Tato třída záměrně nemá žádnou koncepci časového pásma nebo offsetu od-UTC. Představuje tedy datum a denní dobu jako „poledne 23. ledna 2019“, ale nevím, jestli je to poledne například v Tokiu, Paříži nebo Montrealu, tři velmi odlišné okamžiky, které jsou od sebe několik hodin. Tento typ je tedy vhodný pro standardní SQL typ TIMESTAMP WITHOUT TIME ZONE
– bez , nikoli s .
Další diskusi najdete na:Jaký je rozdíl mezi Instant a LocalDateTime?
Správný typ
Pro standardní SQL zadejte TIMESTAMP WITH TIME ZONE
, měli byste používat Java typy Instant
, OffsetDateTime
nebo ZonedDateTime
. Z těchto tří vyžaduje JDBC 4.2 podporu pouze pro druhý, OffsetDateTime
.
Získávání.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Hodnota získaná z Postgres bude vždy v UTC. Standard SQL toto chování nespecifikuje, takže databáze se liší. V Postgresu jakákoliv hodnota odeslaná do pole typu TIMESTAMP WITH TIME ZONE
se upraví do UTC. Načtené hodnoty jsou v UTC.
Ukládání.
myPreparedStatement.setObject( … , odt ) ;
Upravte z UTC (posun nuly) na čas nástěnných hodin používaný lidmi v určité oblasti (časové pásmo).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Nepoužívám JPA, raději věci zjednoduším.
Ale podle této odpovědi , JPA 2.2 podporují java.time typy.
Hibernate také podporuje java.time .