Clojure - 将字符串解析为日期

9

我试图解析一个包含日期的未格式化字符串(例如:today =“08082013”),并将其转换为格式“08.08.2013”。

这个可以工作:(.parse (java.text.SimpleDateFormat. "ddMMyyyy") today) => <Date Sun Jan 01 00:00:00 CET 1950>

但是当我执行(.parse (java.text.SimpleDateFormat. "dd.MM.yyyy") today)时,我会得到错误信息"Unparseable date: "08082013""

为什么?我该如何获得所需的日期格式?

5个回答

17

要将字符串转换为日期,请使用解析函数。

要将日期转换为字符串,请使用格式化函数。

两者都使用格式化程序来描述转换过程。

=>(.format
    (java.text.SimpleDateFormat. "dd.MM.yyyy")
    (.parse
      (java.text.SimpleDateFormat. "ddMMyyyy")
      "08082013"))

"08.08.2013"

4
如果您正在处理日期和时间,我建议查看这个Clojure库,

https://github.com/clj-time/clj-time

这是大多数Clojure程序员使用的时间库,基于Java库joda time,许多人认为它比Java内置的时间库更好。


clj-time 已被弃用,因为它是基于 Joda time 的。 参见:https://dev59.com/4l0a5IYBdhLWcg3w-8wi - Mariana B.
@MarianaB。clj-time并没有被'废弃'。建议人们考虑使用java.time,但是目前该项目仍然活跃且得到良好的维护。 - glts
2
是的,我指的是目前的clj-time基于Joda time,而在新版本的Java中已经被弃用了。 - Mariana B.
所以要非常清楚... clj-time是Joda time的包装器。Java Time是Joda time的替代品,而且有一个Clojure包装器可用于Java Time。用户被要求迁移到Java Time而不是Joda time,因此...这意味着远离clj-time。我认为当前推荐的时间库是本地Java Time或其Clojure包装器。https://github.com/dm3/clojure.java-time - Jason

3

0

使用clj-time,你可以这样做:

(defn format-date
  [date-str]
  (f/unparse (f/formatter "dd.MM.yyyy") (f/parse custom-formatter date-str)))

(format-date "08082013") ;=> "08.08.2013"

0

Clojure基于Java,因此许多选项最终都会调用Java。据我所知,Java有两个时间API。旧的在java.text.SimpleDateFormat下,不再推荐使用。新的在java.time下,更好。

考虑到这一点,在Clojure中有几种日期操作选项:

  • 你可以直接调用新旧Java函数中的任何一个。NeilsK的答案提供了如何使用旧API的示例。通过Clojure文档上的Java互操作,您应该能够轻松地将其适应到新的java.time API中。
  • 每个人都在说要使用clj-time,但我不建议这样做,因为它基于一个名为JodaTime的Java库,而当Java的新时间API推出时,该库已被弃用。
  • 我个人使用了一个名为clojure.java-time的库,它是Java新时间API的简单Clojure包装器,取得了很大的成功。
  • juxt/tick看起来非常有前途,因为它试图以Clojure友好的格式提供新的API,不仅在Java平台上,还在浏览器和dotnet上。在撰写本文时,它处于alpha测试阶段,但我会继续关注它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接