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

问题描述:

我刚开始玩wit/duckling。它是用Clojure编写的,我以前没有使用过Clojure。我需要像2016-08-14T19:45:48.000 + 05:30这样的字符串解析为格式,如1945hrs,2016年8月14日星期日。我在互联网上搜索,并遇到lib clj-time。经过很长一段时间的努力后,我碰到这个thread,并认为rfc822是我的一杯茶。所以我用RFC822格式,但它给我的例外:解析字符串以获取Clojure中特定格式的日期和时间

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中完全天真,我请求您详细回答,这将有助于我更好地理解这一点。谢谢。

+0

您使用的是Java 8吗? –

+0

@SamEstep是的,我正在使用Java 8. – sdream

+0

好,太棒了;在这种情况下,我相信我的答案是解决您的问题的最佳解决方案。 –

没有实际检查其预定的格式相匹配的日期格式你可能只要致电:

(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第二RD来天的事情。

+0

我已经更新了我的答案。默认情况下,日期使用UTC进行解析和解析,因此之前的输出是为UTC打印的。 –

clj-time库是Joda-Time的包装。如果您使用的是Java 8,那么您应该更喜欢Joda-Time内置的java.time库,原因解释here。在Clojure中,您可以使用Clojure.Java-Time库,其中包含java.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在他的回答中指出,乔达时没有按”:

[clojure.java-time "0.2.1"] 

然后你就可以在java-time命名空间中的offset-date-timeformat功能t似乎支持你原来的问题中的“th”。从DateTimeFormatter文档来看,java.time也没有。