2016-08-14 121 views
0

我剛開始玩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

好,太棒了;在這種情況下,我相信我的答案是解決您的問題的最佳解決方案。 –

回答

1

沒有實際檢查其預定的格式相匹配的日期格式你可能只要致電:

(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打印的。 –

4

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也沒有。