在Clojure中将字符串转换为日期

5

我有以下格式的字符串:"2013-02-20T17:24:33Z""Mon Feb 25 02:42:27 +0000 2013"

有没有快速的方法将它们转换成日期时间格式,以便可以进行相等性测试和/或排序。

clj-time确实允许我使用这种格式(date-time 1986 10 14 4 3 27 456)。但是为了实现这一点,我必须解析上述两个字符串。由于上述字符串是标准格式,是否有一种方法直接将它们转换为日期时间对象?

谢谢, Murtaza

2个回答

12

clj-time有标准的格式定义,参见clj-time.format/show-formatters,但是你的第二个格式在clj-time看来并不是一个“标准”格式(尽管它看起来非常接近rfc822)。你可以创建自定义格式...

(use 'clj-time.format)

(parse (formatters :date-time-no-ms) "2013-02-20T17:24:33Z")
#<DateTime 2013-02-20T17:24:33.000Z>

(parse (formatter "E MMM dd hh:mm:ss Z YYYY") "Mon Feb 25 02:42:27 +0000 2013" )
#<DateTime 2013-02-25T02:42:27.000Z>

(show-formatters)
:basic-date                             20130228
:basic-date-time                        20130228T114047.213Z
:basic-date-time-no-ms                  20130228T114047Z
:basic-ordinal-date                     2013059
:basic-ordinal-date-time                2013059T114047.213Z
:basic-ordinal-date-time-no-ms          2013059T114047Z
:basic-t-time                           T114047.213Z
:basic-t-time-no-ms                     T114047Z
:basic-time                             114047.213Z
:basic-time-no-ms                       114047Z
:basic-week-date                        2013W094
:basic-week-date-time                   2013W094T114047.213Z
:basic-week-date-time-no-ms             2013W094T114047Z
:date                                   2013-02-28
:date-hour                              2013-02-28T11
:date-hour-minute                       2013-02-28T11:40
:date-hour-minute-second                2013-02-28T11:40:47
:date-hour-minute-second-fraction       2013-02-28T11:40:47.213
:date-hour-minute-second-ms             2013-02-28T11:40:47.213
:date-time                              2013-02-28T11:40:47.213Z
:date-time-no-ms                        2013-02-28T11:40:47Z
:hour                                   11
:hour-minute                            11:40
:hour-minute-second                     11:40:47
:hour-minute-second-fraction            11:40:47.213
:hour-minute-second-ms                  11:40:47.213
:ordinal-date                           2013-059
:ordinal-date-time                      2013-059T11:40:47.213Z
:ordinal-date-time-no-ms                2013-059T11:40:47Z
:rfc822                                 Thu, 28 Feb 2013 11:40:47 +0000
:t-time                                 T11:40:47.213Z
:t-time-no-ms                           T11:40:47Z
:time                                   11:40:47.213Z
:time-no-ms                             11:40:47Z
:week-date                              2013-W09-4
:week-date-time                         2013-W09-4T11:40:47.213Z
:week-date-time-no-ms                   2013-W09-4T11:40:47Z
:weekyear                               2013
:weekyear-week                          2013-W09
:weekyear-week-day                      2013-W09-4
:year                                   2013
:year-month                             2013-02
:year-month-day                         2013-02-28

谢谢,这太棒了!解决了我的问题 :) - murtaza52
我该如何仅访问日期,即我想知道所有匹配的日期,而不考虑秒数。一种方法可能是使用clj-time访问器进行匹配 - 年、月和日。但是是否有更好的方法? - murtaza52

3
使用 SimpleDateFormat
(let [input "Mon Feb 25 02:42:27 +0000 2013"
      fmt (java.text.SimpleDateFormat. "EEE MMM dd HH:mm:ss zzz yyyy")]
  (.parse fmt input))

记住,解析月份和星期几的名称需要适当设置语言环境。
顺便提一下,问题中的第一个日期格式是 ISO 8601

谢谢Jan。我的要求是能够解析这两个日期并进行比较。我该如何转换ISO日期格式,然后可以进行比较吗?我必须收集所有属于同一日期的日期。 - murtaza52
不计算:ParseException 无法解析的日期:"Mon Feb 25 02:42:27 +0000 2013" java.text.DateFormat.parse (DateFormat.java:366) - osxdirk

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