Избегайте изменений часовых поясов с HugSQL
Я создал пустое приложение Clojure, в котором я читаю и записываю поле даты в базу данных и из нее.
Тип столбца в MYSQL
отображается как DATETIME
и в приложении я использую JDBC
водитель и clj-time
оперировать датами.
Я понял, что всякий раз, когда я работаю над полем, происходит следующее:
; When inserting
(insert-record db {:date-field (t/now)})
; (t/now), in the application, returns the date in UTC.
; In the database column, the date appears shifted (+2 hours)
; to match my local timezone
Таким образом, он оставляет приложение как 2018-04-11T04:58:38.137Z
Появляется в БД как 2018-04-11 06:58:38
; When reading a field
(read-record db {:id 123}))))
; This returns a record that contains a java.sql.Date.
; The date comes back to the application shifted (-2 hours),
; assuming that was stored in my local time zone and trying to
; convert the record to UTC.
Значение в БД: 2018-04-03 00:00:00
Значение, полученное в приложении: 2018-04-02 22:00:00
В соответствии с вопросом о передовой практике перехода на летнее время и часовой пояс вы хотите, чтобы "всякий раз, когда вы обращаетесь к точному моменту времени, сохраняйте время в соответствии с единым стандартом, который не зависит от перехода на летнее время", поэтому UTC.
Это может сработать так на моем рабочем сервере, так как он настроил UTC как часовой пояс, но чтобы сделать его более согласованным, я бы хотел получить такое же поведение в DEV.
Кроме того, так как правильность записей важна, я считаю необходимым закрепить это поведение и убедиться, что независимо от часового пояса, настроенного в машине, записи сохраняются в UTC и, следовательно, извлекаются без применения какого-либо преобразования (если мне не нужно это, где я бы вручную конвертировать в пользовательский часовой пояс).
Вся идея кажется разумной, но я не нашел много информации. Интересно, смотрю ли я на проблему с неправильной точки зрения или упускаю что-то большее.
Кто несет ответственность за смену? HugSQL? драйвер JDBC?
Как я могу изменить код, чтобы при вставке полей дата приложения UTC сохранялась как UTC в БД.
Как я могу изменить код, чтобы при чтении полей не выполнялось преобразование?
Если изменения должны были быть применены к большей кодовой базе, можно ли выполнить эту конфигурацию, чтобы она не влияла на другие запросы?
РЕДАКТИРОВАТЬ
@Mark Rotteveel связал этот вопрос. По-видимому, в функции setTimestamp есть параметр календаря, который позволяет указывать часовой пояс. Могу ли я использовать это в моем контексте?
Разумно ли говорить, что это должен быть способ явно установить часовой пояс на уровне приложения, который поддерживается HugSQL или JDBC? Я думал, что если это обычно зависит от часового пояса JVM, не сломается ли много приложений, если часовой пояс сервера изменится по ошибке?