clojure - 如何将时间打印为#inst

标签 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)))
        ;;; ⇒ <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/

相关文章:

string - 哪个是比较字符和字符串的最笨拙的方法? (单字符字符串)

lisp - 同质性,它是如何工作的?

scala - 从Scala sbt任务中调用Clojure代码

for-loop - 我怎样才能改变:while condition on a Clojure for-loop while it is running?

clojure - 是否可以在不进入 REPL 的情况下编译 clojure 源代码?

clojure - 如果用户未登录,如何将他们重定向到不同的页面? (环/组合)

parsing - Clojure - 解析 Elasticsearch 查询响应并提取值

java - Clojure - 消耗的惰性序列元素是否保留在内存中?

clojure - 使用 swank-clojure 攻击 Clojure 库的工作流程

function - 如何从函数列表和值构造函数?