【问题标题】:How can one get a java.time DateTime using clojure.java-time from #inst Date literal?如何从#inst Date 文字中使用 clojure.java-time 获得 java.time DateTime?
【发布时间】:2019-05-02 20:15:15
【问题描述】:

使用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"]

如何使用新的 java.time 包装器 clojure.java-time 完成此操作?

【问题讨论】:

  • 你的意思是LocalDateTime吗? DateTime 来自 joda。

标签: clojure java-time


【解决方案1】:

请注意:Joda Time 和包装它的 clj-time 库均已弃用。您应该通过 Java 互操作使用 java.time 来完成大多数任务。还有some helper functions here你可能会觉得有用。


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")))
    ))

结果

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]

j.u.Date 的此扩展与 java.time 包同时添加到 Java 中,正是为了方便将代码从 java.util.Date 转换为 java.time

请注意,您仍然需要小心,因为示例瞬间会产生两个不同的 LocalDate 对象,具体取决于使用的时区。


如果您正在使用java.time 包,您可能会对我写的some helper functions 感兴趣。 The unit tests 给出了帮助函数以及与本机 java.time 函数互操作的良好示例。

如果您正在那里寻找一个函数但没有找到它,很有可能它已经存在于java.time 包中,并且很容易通过 Java 互操作直接使用。 java.time 是一个经过深思熟虑的库(由以前的 Joda Time 库的作者编写)。 java.time 的大部分功能都在 Clojure 中简单易用,并且不会从包装函数中受益。

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2015-06-22
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多