如何通过忽略时间和秒来将日期解析为clj-time

时间:2013-03-02 17:27:32

标签: clojure

鉴于以下字符串,我想获得一个只有日期的日期时间 -

字符串"2013-02-20T17:24:33Z",我想在忽略时间和秒的情况下得到一个日期。

以下内容可行 - (parse (formatters :date-time-no-ms) "2013-02-2T17:24:33Z")。但是,生成的日期时间对象还包含秒,如何将其减少到仅仅年月?

一种方法是使用正则表达式并提取所需的详细信息,然后将其解析为日期 - (clojure.core/re-find #"\d{4}-\d{2}-\d{1,2}" "2013-02-20T17:24:33Z") (parse (formatters :date) "2013-02-20")

然而,仅使用clj-time应该有更好的方法来实现上述目标吗?

3 个答案:

答案 0 :(得分:4)

clj-time只是Joda Time的一个包装器,所以你可以直接在DateTime对象上调用方法,幸运的是有一个方法DateTime#toDateMidnight()

user=> (parse (formatters :date-time-no-ms) "2013-02-2T17:24:33Z")
#<DateTime 2013-02-02T17:24:33.000Z>
user=> (.toDateMidnight (parse (formatters :date-time-no-ms) "2013-02-2T17:24:33Z"))
#<DateMidnight 2013-02-02T00:00:00.000Z>

答案 1 :(得分:1)

(defn floor [dt f] 
  (apply date-time 
    (map #(%1 dt) 
      (take-while (partial not= f) [year month day hour minute sec milli]))))

(floor (parse (formatters :date-time-no-ms) "2013-02-2T17:24:33Z") hour)

答案 2 :(得分:0)

使用DateTime方法.withTimeAtStartOfDay

(let [^DateTime dt (parse (formatters :date-time-no-ms) "2013-02-2T17:24:33Z")]
  (.withTimeAtStartOfDay dt))

请注意,type hint ^DateTime会显着提升效果。