Clojure 如何将时间打印为#inst
日期文字很容易阅读:Clojure 如何将时间打印为#inst,clojure,Clojure,日期文字很容易阅读: (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)))
(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)
(pr str(clj time.core/now))
;;; ⇒ "#"
(读取字符串(pr str(clj time.core/now)))
;;; ⇒
;;; RuntimeException不可读表单clojure.lang.Util.RuntimeException(Util.java:219)
当您读入#inst
文本时,默认情况下会创建一个java.util.Date
实例。它们在clojure.instant
命名空间中为print method
(负责对象打印表示的多方法)定义了一个方法(1.5.1源代码的相关片段为)
clj time使用Joda time中的DateTime
类型,该类型没有设置自定义的打印方法
方法。这是有道理的,因为很少需要使用打印方法
,该方法生成不往返的表示。为了让它往返,您必须使用非标准的#inst
读卡器。要实现这一点,如果您正在读取edn数据,可以使用clojure.edn/read
(或read string
)将文档字符串中记录的相应读取器传入:
(require '[clojure.edn :as edn])
(edn/read {:readers {'inst your-inst-reader}} rdr)
当使用clj time时,您的inst reader
将类似于#(clj-time.format/parse some formatter%)
。然后,您可以按照clojure.instant
的示例提供匹配的打印方法
定义。(或者您可以只提供print方法
定义,并记住您不会得到完美的往返;clj time提供了非常方便的强制功能——请参见下文——所以这可能没问题。)
或者,您可以打印和读取
java.util.Date
实例,并将它们转换为DateTime
s;在clj time.concure
中有这样做的函数。我正在使用clojure 1.5.1,在REPL(java.util.Date.)中输入以下内容。
打印#inst“2013-07-09T18:05:53.231-00:00”
。注意clj time.core/now
是一个DateTime对象,就是Joda。哦,我明白了,我的错误。谢谢:)。如何将DateTime
转换为java.util.Date
并将其打印?我最终强制转换为java.util.Date。我问上游是否可以提供一个通用解决方案:等等,那么如何将时间戳打印为#而不是“YYYY-MM…”
?