我创建了一个空的 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 形式保存,因此无需应用任何转换即可检索(除非我需要它,我将手动转换为用户时区)。
整个想法似乎合理,但我没有找到太多信息。我想知道我是从错误的角度看待这个问题还是遗漏了更大的东西。
谁负责转变?拥抱SQL?JDBC 驱动程序?
如何修改代码以便插入 UTC 申请日期字段作为 UTC 存储在数据库中。
如何修改代码以便在读取字段时不进行转换?
如果必须将更改应用于更大的代码库,是否可以进行此配置以不影响其他查询?
编辑
@Mark Rotteveel 链接了这个问题。显然,setTimestamp 函数中有一个 calendar 参数可以让您指定时区。我可以在我的上下文中使用它吗?
是否可以合理地说它应该是一种在应用程序级别显式设置时区的方法,由 HugSQL 或 JDBC 保留?我在想,如果这通常依赖于 JVM 时区,如果服务器的时区错误地更改,会不会有很多应用程序中断?