gpt4 book ai didi

clojure - 如何将 clojure 的 #inst 文字转换为等效的 java.time 类型?

转载 作者:行者123 更新时间:2023-12-03 21:08:20 24 4
gpt4 key购买 nike

我用过 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

最佳答案

1小时后。那没有用。
结果 next.jdbc 用 重建记录java.sql. * 类型,恰好在 REPL 中被打印为 #inst 文字。
调用 (.toInstant sql-date-instance)因异常而爆炸(这是设计的)。然而,有了这些信息,很容易实现最终结果。通过此映射器运行返回的 map 向量。

(defn mapSqlToTimeTypes [map-with-sql-types]
(reduce (fn [return-map [k, v]]

(cond
(instance? java.sql.Timestamp v) (assoc return-map k (.toInstant v))
(instance? java.sql.Date v) (assoc return-map k (.toLocalDate v))
:else (assoc return-map k v)))
{}
map-with-sql-types))

关于clojure - 如何将 clojure 的 #inst 文字转换为等效的 java.time 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65409044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com