如何以#inst打印时间

eve*_*_jr 13 clojure

阅读日期文字很容易:

(read-string "#inst \"2012\"")
        ;;; ? #inst "2012-01-01T00:00:00.000-00:00"
Run Code Online (Sandbox Code Playgroud)

如何输出日期作为#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)
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 11

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

clj-time使用DateTimeJoda-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)
Run Code Online (Sandbox Code Playgroud)

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

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