Сохранение LocalTime в столбце MySql TIME - PullRequest
0 голосов
/ 11 декабря 2018

Backstory

Недавно я столкнулся с проблемой сохранения LocalTime в TIME столбце в базе данных MySQL.Сохранение значения 9:00 приводило к сохранению 8:00 в базе данных.

Эта проблема не возникала в моей среде разработки (Windows), но возникала на двух машинах с Linux, которые мы пробовали.

Мой код был следующим:

preparedStatement.setObject(parameterIndex, localTime, JDBCType.TIME);

После исследования я в конечном итоге обнаружил, что драйвер MySQL JDBC использовал java.sql.Time.valueOf(localTime), а затем SimpleDateFormat с часовым поясом, установленным в MySql.системное свойство сервера system_time_zone (через time_zone = 'SYSTEM'), чтобы вывести его в виде строки.

На машинах Linux system_time_zone было GMT, а на машине Windows - GMT Standard Time,(Я нахожусь в Великобритании.)

Итак, LocalTime 9:00 был преобразован в Time из 9:00 Europe/London (фактически смоделирован как 1st January 1970 9:00 Europe/London), и тогда это было записаноиспользуя часовой пояс GMT, который обрабатывается так же, как UTC.Теперь, как правило, эти два часовых пояса имеют нулевое смещение относительно UTC в январе, но Великобритания оставалась в летнее время в течение всего года в 1969 и 1970 годах. Таким образом, был вычтен один час.

Вопрос

Каков наилучший способ записи LocalTime в базу данных MySQL, чтобы избежать подобных проблем?Я просто хочу 9:00, без часового пояса, без даты, просто время суток.Я не хочу, чтобы он учитывал разницу в часовом поясе, потому что это просто 9:00, а не в какой-то конкретный день или место.

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

...