15

日付リテラルを読むのは簡単です:

(read-string "#inst \"2012\"")
        ;;; ⇒ #inst "2012-01-01T00:00:00.000-00:00"

#inst...日付をリテラルとして出力するにはどうすればよいですか?

これは動作しません:

(pr-str (clj-time.core/now))
        ;;; ⇒ "#<DateTime 2013-07-09T17:26:30.058Z>"

(read-string (pr-str (clj-time.core/now)))
        ;;; ⇒ <err>
        ;;;   RuntimeException Unreadable form  clojure.lang.Util.runtimeException (Util.java:219)
4

1 に答える 1

11

リテラルを読み込むと、#instデフォルトでjava.util.Dateインスタンスが作成されます。これらには、名前空間で定義されたメソッドprint-method(オブジェクトの出力表現を担当するマルチメソッド) がありclojure.instantます (1.5.1 ソースの関連するフラグメントはhere です)。

clj-time は、DateTimeカスタムprint-methodメソッドが設定されていない Joda-Time の型を使用します。print-method往復しない表現を生成する を持つことはめったに望ましくないため、これは理にかなっています。往復するには、非標準の#instリーダーを使用する必要があります。それを達成するために、edn データを読んでいる場合は、ドキュメント文字列に記載されているように、適切なリーダーを使用clojure.edn/read(またはread-string) 渡すことができます。

(require '[clojure.edn :as edn])

(edn/read {:readers {'inst your-inst-reader}} rdr)

clj-time を使用すると、 のyour-inst-readerようになります#(clj-time.format/parse some-formatter %)print-methodの例に従って、一致する定義を指定できますclojure.instant。(または、単にprint-method定義を提供し、完全なラウンドトリップが得られないことを覚えておくこともできます。clj-time は非常に便利な強制関数を提供します (以下を参照)。これで問題ない可能性があります。)

または、インスタンスを印刷して読み取り、 sjava.util.Dateとの間で変換することもできます。DateTimeにはそれを行うための関数がありますclj-time.coerce

于 2013-07-09T18:11:52.647 に答える