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
в виде строки и отправляю это в базу данных, но я чувствую, что должен быть лучший способ.Есть ли?