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)

ref: 📝Clojure Java Interop

✅Clojure Date/Time Tips

現在時刻を取得する

Javaを呼び出すか, clj-time/java-timeをつかう.

以下はJava直接呼び出し.

;; deplicated
(defn now []
  (java.util.Date.))
;; prefer
(defn now []
  (java.time.LocalDateTime/now))

🔗References