gpt4 book ai didi

clojure - 如何将时间打印为#inst

转载 作者:行者123 更新时间:2023-12-02 10:17:57 24 4
gpt4 key购买 nike

读取日期文字很容易:

(read-string "#inst \"2012\"")
;;; ⇒ #inst "2012-01-01T00:00:00.000-00:00"

如何将日期输出为 #inst... 文字?

这不起作用:

(pr-str (clj-time.core/now))
;;; ⇒ "#<DateTime 2013-07-09T17:26:30.058Z>"

(read-string (pr-str (clj-time.core/now)))
;;; ⇒ <err>
;;; RuntimeException Unreadable form clojure.lang.Util.runtimeException (Util.java:219)

最佳答案

当您读取#inst 文字时,默认情况下会创建一个java.util.Date 实例。它们在 clojure.instant 命名空间中为 print-method (一种负责打印对象表示的多方法)定义了一个方法(1.5.1 源代码的相关片段是here)。

clj-time 使用 Joda-Time 中的 DateTime 类型,该类型没有设置自定义 print-method 方法。这是有道理的,因为很少需要使用生成不往返表示的 print-method 。为了使其能够往返,您必须使用非标准的#inst阅读器。为此,如果您正在读取 edn 数据,则可以使用 clojure.edn/read(或 read-string)传递适当的读取器,如其文档字符串中所述:

(require '[clojure.edn :as edn])

(edn/read {:readers {'inst your-inst-reader}} rdr)

使用 clj-time 时,your-inst-reader 将类似于 #(clj-time.format/parse some-formatter %)。然后,您可以按照 clojure.instant 示例提供匹配的 print-method 定义。 (或者您可以只提供 print-method 定义,并记住您不会获得完美的往返;clj-time 提供非常方便的强制转换函数 - 见下文 - 所以这可能没问题。)

或者,您可以打印和读取 java.util.Date 实例,并将它们与 DateTime 进行相互转换; clj-time.coerce 中有用于执行此操作的函数。

关于clojure - 如何将时间打印为#inst,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554560/

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