阅读日期文字很容易:
(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.
| 归档时间: |
|
| 查看次数: |
4731 次 |
| 最近记录: |