ISO-8601 形式で入力した日時と現在時刻の差分を求める duration
というツールをリリースしました。
これは以前に作った instant
という現在時刻の ISO-8601 表現や、unix time を出力するコマンドを補完するツールになります。
instant
には java.time.Duration
の文字列表現を渡して、 1 時間前の unix time を出力する機能があります。しかし特定の日時、例えば 2020-01-01T00:00:00+09:00
の unix time を出力したいみたいなケースは気合で java.time.Duration
を計算せねばならず、使いづらいところがありました。
また instant
コマンドで日時を指定できるようにすると、 API 的に分かりづらいところが発生する(既存の出力用の日時フォーマットと入力用の日時のフォーマットの2つのフォーマットの入力が求められてしまう)ため、機能を追加するかどうかをためらっていました。
そこで、現在の時刻から指定時刻までの java.time.Duration
を計算する別のツールを用意すれば、この課題が解決できるのではないかと思いいたり、今回 duration
というコマンドを作ることにしました。
(僕が date
コマンドを使いこなせればよかったわけだけど、いつまで経っても覚えられる気がしない)
duration
の使い方は先に書いたとおりで、 ISO-8601 表現の日時をパラメーターに渡すと java.time.Duration
の文字列表現が出力されます。
たとえば、 現在の時刻から見て 2020-01-02T15:04:05Z はどれくらいの時間が経っているかを求めるとすると次のように入力します。
duration 2020-01-02T15:04:05Z
さて、この出力結果を instant
コマンドに渡してみます
instant -a $(duration 2020-01-02T15:04:05Z)
結果は当たり前といえば当たり前の結果になっていますが、これが力を発揮するのは unix time を求める場合です
instant -f unix -a $(duration 2020-01-02T15:04:05Z)
これで計算を頑張らなくても良くなりました
duration
も instant
と同様、 java.time
の機能をそのまま Java の外に持ち出したもので、 GraalVM の native-image
にてネイティブバイナリー化してあります。
ビルドは github actions で行い、最近対応したとかいう手動でイベントを作れる workflow_dispatch
によって、タグ付け、リリース作業を行う形にしてみました
コマンドラインのパラメーターの処理には picocli を使いましたが、 config.json の出力には picocli-codegen を使わずに graalvm-native-image plugin の config 出力機能を使いました