解析字符串以在Clojure中以特定格式获取日期和时间

时间:2016-08-14 15:15:22

标签: clojure clj-time

我刚开始玩wit/duckling。它是用Clojure编写的,我之前没有Clojure的经验。我需要解析像 2016-08-14T19:45:48.000 + 05:30 这样的字符串,格式为 1945hrs,2016年8月14日星期日。我在互联网上搜索并找到了lib clj-time。经过长时间的努力,我遇到了这个thread并认为 rfc822 是我的一杯茶。所以我使用了格式化程序rfc822,但它给了我异常:

java.lang.IllegalArgumentException: Invalid format: "2016-08-16T00:00:00.000+05:30"

这是我的代码:

(ns firstproj.core
  (:gen-class)
  (:require [duckling.core :as p])
  (:require [clj-time.format :as f]))

(defn -main
  "I don't do a whole lot."
  [x]
  (p/load! { :languages ["en"]})
  (def var_ (p/parse :en$core x [:time]))
  (def date_string "2016-08-14T19:45:48.000+05:30")
  (f/parse (f/formatters :rfc822) date_string))

所以有人能告诉我这里做错了什么。或者在Clojure中以任何其他方式获得我想要的日期时间格式。由于我在Clojure中完全天真,我请求你详细回答,这将有助于我以更好的方式理解这一点。谢谢。

2 个答案:

答案 0 :(得分:4)

clj-time库是Joda-Time的包装器。如果你使用的是Java 8,你应该更喜欢内置的java.time库而不是Joda-Time,理由是here。在Clojure中,您可以使用包裹java.time的{​​{3}}库。首先,将其添加到您的依赖项中:

[clojure.java-time "0.2.1"]

然后,您可以使用java-time命名空间中的Clojure.Java-Timeoffset-date-time函数:

(require '[java-time :as time])

(->> (time/offset-date-time "2016-08-14T19:45:48.000+05:30")
     (time/format "HHmm'hrs', EEEE, MMMM d y"))
;;=> "1945hrs, Sunday, August 14 2016"

正如@Piotrek在他的回答中指出的那样,Joda-Time似乎并不支持你原来问题中的“th”。从format文档来看,java.time也没有。

答案 1 :(得分:2)

如果没有实际检查哪个预定义格式化程序与您的日期格式匹配,您可以调用:

(f/parse "2016-08-14T19:45:48.000+05:30")
;; => #object[org.joda.time.DateTime 0x1bd11b14 "2016-08-14T14:15:48.000Z"]

它将尝试所有预定义的格式化程序,并从第一个成功的格式化程序返回解析后的值。

然后以自定义格式打印:

(require '[clj-time.core :as t])

(def my-time-zone (t/time-zone-for-offset 5 30))

(def my-formatter
  (f/formatter
    "HHmm'hrs', EEEE, MMMM dd yyyy"
    my-time-zone))

(f/unparse my-formatter some-date)
;; => "1945hrs, Sunday, August 14 2016"

不幸的是,据我所知,JodaTime并没有处理诸如添加 st nd rd th 到几天。