1

wit/ducklingで遊び始めたところです。これは Clojure で書かれており、Clojure の経験はありません。2016-08-14T19:45:48.000+05:30のような文字列を1945hrs, Sunday, August 14th 2016 のような形式に解析する必要があります。インターネットで検索したところ、 lib clj-timeに出会いました。長い間苦労した後、このスレッドに出くわし、 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 にまったく疎いので、詳細に回答していただければ、これをよりよく理解するのに役立ちます。ありがとうございました。

4

2 に答える 2

7

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

[clojure.java-time "0.2.1"]

次に、名前空間で関数offset-date-timeformat関数を使用できます。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 が彼の回答で指摘したように、Joda-Time は元の質問の「th」をサポートしていないようです。DateTimeFormatterドキュメントから判断すると、どちらもありませんjava.time

于 2016-08-14T16:06:40.863 に答える
3

どの事前定義されたフォーマッターが日付形式に一致するかを実際に確認せずに、次のように呼び出すだけです。

(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 はstndrdthを daysに追加するようなことを処理しません。

于 2016-08-14T15:25:43.543 に答える