日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

[Clojure] clj-time を使う

java.util.Date でフォーマットとか考えると途端に面倒くさくなったので clj-timeを使ってみた。

楽だ。

ただ、少し調べた事もあったのでメモ。

日時と日でクラスが違う

(require
  '[clj-time.core :as t]
  '[clj-time.format :as tf]
  '[clj-time.local :as tl]))

; ローカルタイムゾーンの現在の日時を返す
(tl/local-now)
=> #<DateTime 2013-11-11T21:07:30.394+09:00>

; ローカルタイムゾーンの日付を返す
(t/today)
=> #<LocalDate 2013-11-11>

formatter で指定可能なフォーマット書式

これは元の Java の Joda-Time の方を見ると下記情報がある。
Joda-Time - Java date and time API - Formatting

タイムゾーンの文字列表記取得

結局使わなかったのだが、日時まで欲しい時は(from|to)-time-zone でタイムゾーンを指定して取る必要がある。その時の指定方法として t/time-zone-for-id か t/time-zone-for-offset どちらかを使えるのだが、offset の指定の仕方が良く分からず、id の方を探してみると java.util.TimeZoneで以下の方法で取得可能なのが分かった。

(import java.util.TimeZone)
=> java.util.TimeZone
(.getID (TimeZone/getDefault))
=> "Asia/Tokyo"

現在のタイムゾーンでの Java での指定方法が分かれば後は使うだけ。

(t/to-time-zone (t/now) (t/time-zone-for-id "Asia/Tokyo"))
#<DateTime 2013-11-11T21:16:14.187+09:00>

ローカルタイムゾーンでの時間のフォーマット時

内部的には UTC で保持している為 formatter でなく formatter-local を使う。

(tf/unparse (tf/formatter-local "yyyy/MM/dd kk:mm:ss") (tl/local-now))
=> "2013/11/11 21:11:26"

(tf/unparse (tf/formatter "yyyy/MM/dd kk:mm:ss") (tl/local-now))
=> "2013/11/11 12:11:36"