Неправильный тип
LocalDateTime
неправильный тип здесь. Этот класс не может представлять момент, как объяснено в его Javadoc.
Этот класс намеренно не имеет понятия о часовом поясе или смещении от UTC. Таким образом, он представляет дату и время суток, такие как «полдень 23 января 2019 года», но не знаю, будет ли это полдень в Токио, Париже или Монреале, например, три совершенно разных момента, которые несколько часов друг от друга. Так что этот тип подходит для стандартного типа SQL TIMESTAMP WITHOUT TIME ZONE
- без , а не с .
Подробнее об этом см .: В чем разница между Instant и LocalDateTime?
Правильный тип
Для стандартного типа SQL TIMESTAMP WITH TIME ZONE
вы должны использовать типы Java Instant
, OffsetDateTime
или ZonedDateTime
. Из этих трех JDBC 4.2 требует поддержки только для второго, OffsetDateTime
.
индексирование.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Значение, полученное из Postgres, всегда будет в UTC. Стандарт SQL не определяет это поведение, поэтому базы данных различаются. В Postgres любое значение, отправляемое в поле типа TIMESTAMP WITH TIME ZONE
, настраивается в UTC. Полученные значения в UTC.
Запоминание.
myPreparedStatement.setObject( … , odt ) ;
Настройте UTC (смещение нуля) на время настенных часов, используемое людьми определенного региона (часового пояса).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Я не использую JPA, предпочитаю быть проще.
Но согласно этому ответу , JPA 2.2 поддерживает типы java.time .
Hibernate также поддерживает java.time .