读取日期文字很容易:
(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/