使用HugSQL

时间:2018-04-11 05:19:22

标签: java jdbc clojure 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

根据Daylight saving time and time zone best practices问题,您希望"无论何时提到确切的时刻,都要按照不受夏令时影响的统一标准来保持时间",所以UTC。

这在我的生产服务器上会像这样工作,因为它已将UTC配置为时区,但为了使体验更加一致,我想在DEV中获得相同的行为。

此外,由于记录的正确性很重要,我认为有必要密封此行为,并确保无论机器中配置的时区如何,记录都以UTC格式保存,因此无需应用任何转换即可检索(除非我需要它,我将手动转换为用户时区)。

整个想法看似合理,但我找不到太多信息。我想知道我是从错误的角度看问题还是错过了更大的问题。

  • 谁负责转变? HugSQL? JDBC驱动程序?。

  • 如何修改代码,以便插入UTC应用日期作为UTC存储在数据库中的字段。

  • 如何修改代码,以便在阅读字段时不进行转换?

  • 如果必须将更改应用于更大的代码库,是否可以进行此配置以使其不会影响其他查询?

修改

@Mark Rotteveel链接this question。显然,setTimestamp函数中有一个日历参数,允许您指定时区。我可以在我的上下文中使用它吗?

说它应该是一种在HugSQL或JDBC保存的应用程序级别显式设置时区的方法吗?我在想,如果这通常依赖于JVM时区,那么如果服务器的时区错误地改变,很多应用程序都不会中断吗?

0 个答案:

没有答案