8

我正在尝试将包含日期(例如今天=“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"

为什么?如何获得我想要的日期格式?

4

5 回答 5

16

要从字符串获取日期,请使用 parse。

要从日期到字符串,请使用格式。

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

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

"08.08.2013"
于 2013-08-08T12:18:36.360 回答
4

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

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

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

于 2013-08-09T10:04:46.060 回答
3

SimpleDateFormat 的 .parse 方法不会生成字符串,它会读取字符串并生成java.util.Date 对象。如果你想生成一个点分字符串,你需要 SimpleDateFormat 和点,并在其上调用 .format,给定一个 java.util.Date。

请参阅http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html或查看 clj-time

于 2013-08-08T12:11:26.447 回答
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"
于 2014-10-31T01:38:18.470 回答
0

Clojure 基于 Java,因此您的许多选项最终都会调用 Java。据我了解,Java 有两个时间 API。旧的在java.text.SimpleDateFormat,不再推荐。新的正在下java.time并且“好多了”。

考虑到这一点,您可以在 Clojure 中使用多种日期操作选项:

  • 您可以直接调用新的或旧的 Java 函数。NeilsK 的回答提供了有关如何使用旧 api 执行此操作的示例。在 java interop 上java.time的 Clojure 文档的帮助下,您应该能够相当容易地将其适应新的api 。
  • 每个人都在说使用clj-time,但我不推荐它,因为它基于一个名为 JodaTime 的 Java 库,当 Java 的新时间 API 出现时该库已被弃用。
  • 我个人在一个名为clojure.java-time的库上取得了很大的成功,它是 Java 新时间 api 的一个简单的 Clojure 包装器。
  • juxt/tick看起来很有前途,因为它不仅寻求在 Java 平台上,而且在浏览器和 dotnet 上以对 clojure 友好的格式提供新的 api。在撰写本文时它处于 alpha 阶段,但我会密切关注它。
于 2020-06-05T16:03:10.877 回答