Вы должны отслеживать моменты в своей базе данных в столбце типа TIMESTAMP
в MySQL версии 8. Этот тип похож на SQL стандартный тип TIMESTAMP WITH TIME ZONE
.
Использование JDB C 4.2 или более поздней, обменивайтесь java .time объектами с вашей базой данных.
ZoneId z = ZoneId.of( "America/Denver" ) ;
LocalDate ld = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 2 , 0 ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Класс ZonedDateTime
автоматически настраивается на такие аномалии, как летнее время (DST). Если 2:00 не существует в определенную дату в определенную дату с переходом на летнее время «Весна вперед», время суток устанавливается на 3:00.
Как ни странно, JDB C 4.2 требует поддержки для OffsetDateTime
, но не для более часто используемых Instant
и ZonedDateTime
. Так что конвертируйте.
myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ) ;
Извлечение.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;
Обратите внимание, что при использовании этого подхода мы не заботимся о текущем часовом поясе по умолчанию на сервере или клиенте, а также заботиться о текущем часовом поясе по умолчанию в вашей сессии.