使用clj-time可以像这样解析 #inst Date 文字:
(require '[clj-time.coerce :as c])
(c/from-date #inst "2012-12-12")
;; => #object[org.joda.time.DateTime 0x4a251269 "2012-12-12T00:00:00.000Z"]
Run Code Online (Sandbox Code Playgroud)
这将如何使用新的 java.time 包装器clojure.java-time来完成?
请注意:Joda Time 和clj-time包装它的库都已弃用。java.time对于大多数任务,您应该通过 Java 互操作使用。这里还有一些辅助函数,您可能会觉得有用。
Clojure 将每个#inst文字转换为一个java.util.Date对象。您只需要内置.toInstant()方法:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test)
(:import [java.time ZonedDateTime ZoneId]))
(defn inst->date-time
"Convert a java.time.Instant to a DateTime for the supplied ZoneId"
[inst zoneid]
(.toLocalDate zdt-utc
(ZonedDateTime/ofInstant instant zoneid)))
(dotest
(let [may-4 #inst "2018-05-04T01:23:45.678-00:00" ; a java.util.Date
instant (.toInstant may-4) ]
(spyxx may-4)
(spyx instant)
(println "utc =>" (inst->date-time instant (ZoneId/of "UTC")))
(println "nyc =>" (inst->date-time instant (ZoneId/of "America/New_York")))
))
Run Code Online (Sandbox Code Playgroud)
结果
may-4 => <#java.util.Date #inst "2018-05-04T01:23:45.678-00:00">
instant => #object[java.time.Instant 0x2207eb9f "2018-05-04T01:23:45.678Z"]
utc => #object[java.time.LocalDate 0x62b5a16f 2018-05-04]
nyc => #object[java.time.LocalDate 0x379b6a27 2018-05-03]
Run Code Online (Sandbox Code Playgroud)
这个扩展与包j.u.Date同时添加到 Java 中,java.time正是为了方便代码从 java.util.Date到 的转换java.time。
请注意,您仍然必须小心,因为示例瞬间会产生两个不同的LocalDate对象,具体取决于所使用的时区。
如果您正在使用该java.time包,您可能会对我编写的一些辅助函数感兴趣。 单元测试给出了帮助函数和与本机java.time函数互操作的很好的例子。
如果您正在那里寻找一个函数但没有找到它,很有可能它已经存在于java.time包中,并且很容易通过 Java 互操作直接使用。 java.time是一个经过深思熟虑的库(由上一个Joda Time库的作者)。java.timeClojure 的大多数功能都很简单且易于使用,并且无法从包装器功能中受益。