15

日期文字很容易阅读:

(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)
4

1 回答 1

11

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

clj-time 使用DateTime来自 Joda-Time 的类型,它没有print-method设置自定义方法。这是有道理的,因为print-method很少需要 a 产生不往返的表示。为了让它往返,您必须使用非标准#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 %). 然后,您可以print-method按照 的示例提供匹配的定义clojure.instant。(或者你可以只提供print-method定义并记住你不会得到完美的往返;clj-time 提供了非常方便的强制函数——见下文——所以这可能没问题。)

或者,您可以打印和读取java.util.Date实例并将它们转换为DateTimes; 有这样做的功能clj-time.coerce

于 2013-07-09T18:11:52.647 回答