我使用了 next.jdbc 库将一条记录持久化到 PostgreSQL 表。如下所示,这些值是 LocalDate 实例和 Instant 实例。SQL 列分别为 DATE 类型和 TIMESTAMPTZ 类型。
在文档中提到,需要使用
在文档中提到,需要使用
next.jdbc.date-time
命名空间来进行 Java -> SQL 的映射。{:id 7, :trade_date #object[java.time.LocalDate 0x6b751cb1 2020-12-22], :created_at #object[java.time.Instant 0x3add5e17 2020-12-22T11:41:07.557790Z]}
当我读回记录(SQL -> Clojure)时,其表示如下
{:id 7, :trade_date #inst "2020-12-21T18:30:00.000-00:00", :created_at #inst "2020-12-22T11:41:07.557790000-00:00"}
所以它们被读取为 #inst 字面量吗? 我希望将它们作为 java.time 类型返回。还要注意,LocalDate 似乎被转换为 UTC 时间戳。以下是我迄今挖掘到的内容。
; inst -> Instant
=> (.toInstant #inst "2020-12-22T11:41:07.557790000-00:00")
#object[java.time.Instant 0x312cc79e "2020-12-22T11:41:07.557Z"]
; inst -> LocalDate
=> (-> #inst "2020-12-21T18:30:00.000-00:00"
#_=> .toInstant
#_=> (ZonedDateTime/ofInstant (ZoneId/of "UTC"))
#_=> (.withZoneSameInstant (ZoneId/systemDefault))
#_=> (.toLocalDate))
#object[java.time.LocalDate 0x44048462 "2020-12-22"]
看起来并不简单/符合Clojure的方式。是否有更好的方法?
参考资料: 从Alan Thompson和Basil Bourque的答案中整理而来。