- up: 📂Clojure Core Languages
- tags: 🔖Date/Time/Timestamp
- refs.
Overview
Clojureにおける時間の扱いについてまとめ.
ClojureはJavaの仕組みを利用しているので📝Java Date/Time/Timestampの知識があるとよい.
Clojureはたんなるラッパーなので困ったときにもJavaと一緒に検索で探すといい. 最悪Javaを呼び出せばなんとかなる.
Java joda-time vs java.time
Javaの時間のAPIがJava8を堺にわかれるようにClojureもjava.timeとjoda-timeのどちらをつかうかを気にかける必要がある.
;=> #object となっていたらjava.time, ;=> #instとなっていたらJoda-Time.
なおclojure標準のclojure.instantはjoda-time.
clojure.instant
文字列を読み取る関数がいくつか定義されている.
https://clojuredocs.org/clojure.instant
- parse-timestamp: RFC3339-likeフォーマットのparse.
- read-instant-xxx
これはJava: Joda-Timeとなる.
clj-time
https://github.com/clj-time/clj-time
おそらくデファクトスタンダードなClojure のライブラリ.
バックエンドのJava: Joda-Time APIのラッパーライブラリ.
しかし注意書きとして Java8以降はJava Timeをラップしている clojure.java-time を使ったほうがいいとのこと.
JavaではJava8よりJava Timeというパッケージが標準で使えるようになり, それ以前に使われていた Joda Timeを置き換えるようになった.
そのためclojureの方針としてもJoda TimeではなくJava Timeをつかうのがいい.
clojure.java-time
A Clojure wrapper for Java8 Java: Date Time API.
https://github.com/dm3/clojure.java-time
✅ 文字列はparseするには?
local-date-timeやzoned-date-timeの第一引数にフォーマットの文字列を渡す.
注意点は, TやZはは(”)で囲むこと.
(def format "yyyy-MM-dd'T'HH:mm:ss")
(def timestamp "2022-08-16T02:25:24")
(t/local-date-time format timestamp)
Java Libraries Interop
Javaの関数を呼び出してもいい.
SimpleDataFormatを使う例.
(import '[java.text SimpleDateFormat])
(def twitter-timestamp "Sat Mar 12 20:34:57 +0000 2022")
(def twitter-format "EEE MMM dd HH:mm:ss Z yyyy")
(def locale java.util.Locale/US)
(def sdf (SimpleDateFormat. twitter-format locale))
(.setTimeZone sdf (java.util.TimeZone/getTimeZone "Asia/Tokyo"))
(.parse sdf twitter-timestamp)
✅Clojure Date/Time Tips
現在時刻を取得する
Javaを呼び出すか, clj-time/java-timeをつかう.
以下はJava直接呼び出し.
;; deplicated
(defn now []
(java.util.Date.))
;; prefer
(defn now []
(java.time.LocalDateTime/now))