JDB C Mysql Проблема часового пояса с сохранением дневного света - PullRequest
0 голосов
/ 24 апреля 2020

У меня возникла проблема с MySql Выбор выписки для поля даты с сохранением дневного света.

Причина: java. sql .SQLException: HOUR_OF_DAY: 2 -> 3

Единственное решение, с которым работало, это установка serverTimezone=GMT-6 в MySql Строка соединения. Но это мне нужно будет изменить, когда нет перехода на летнее время.

Если я пытаюсь установить serverTimezone=America/Denver, то выдает ту же ошибку.

Причина: java. sql .SQLException: HOUR_OF_DAY: 2 -> 3

Часовой пояс моей базы данных: Америка / Денвер

Мой проект - проект Джерси с Java 8 и Mybatis.

Я попробовал несколько предложенных решений, но ничего не работает бетон. Пожалуйста, объясните мне это.

1 Ответ

1 голос
/ 24 апреля 2020

Вы должны отслеживать моменты в своей базе данных в столбце типа 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 ) ;

Обратите внимание, что при использовании этого подхода мы не заботимся о текущем часовом поясе по умолчанию на сервере или клиенте, а также заботиться о текущем часовом поясе по умолчанию в вашей сессии.

...