2016-08-14 9 views
0

ちょうどwit/ducklingで遊んでいます。それはClojureで書かれており、私はClojureで以前の経験はありません。 2016-08-14T19:45:48.000 + 05:30のような文字列を1945hrs、日曜日、8月14日、2016のような形式に解析する必要があります。私はインターネットで検索し、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

OK、素晴らしい;その場合、私は自分の答えがあなたの問題に対する最良の解決策であると信じています。 –

答えて

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日にSTNDRD、番目を追加するようなものを処理しません。

+0

私は自分の答えを更新しました。デフォルトでは、日付は解析され、UTCを使用して解析されないので、以前の出力はUTCで出力されます。 –

4

clj-timeライブラリは、Joda-Timeのラッパーです。 Java 8を使用している場合は、hereの理由で、Joda-Timeよりも組み込みのjava.timeライブラリが好きです。 Clojureではjava.timeをラップするClojure.Java-Timeライブラリを使用できます。まず、あなたの依存関係に追加します。

[clojure.java-time "0.2.1"] 

次にあなたがjava-time名前空間にoffset-date-timeformat機能を使用することができます。@Piotrekは彼の答えで指摘したよう

(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" 

、ジョダ-時間」doesnの元の質問の "th"をサポートしているようです。 DateTimeFormatterのドキュメントから判断すると、java.timeもありません。

関連する問題