mike-neckのブログ

Java or Groovy or Swift or Golang

指定時刻と現在時刻の差分を求める duration というツールをリリースした

ISO-8601 形式で入力した日時と現在時刻の差分を求める duration というツールをリリースしました。

github.com

これは以前に作った instant という現在時刻の ISO-8601 表現や、unix time を出力するコマンドを補完するツールになります。

mike-neck.hatenadiary.com

instant には java.time.Duration の文字列表現を渡して、 1 時間前の unix time を出力する機能があります。しかし特定の日時、例えば 2020-01-01T00:00:00+09:00unix 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

f:id:mike_neck:20200712015627p:plain

さて、この出力結果を instant コマンドに渡してみます

instant -a $(duration 2020-01-02T15:04:05Z)

f:id:mike_neck:20200712020358p:plain

結果は当たり前といえば当たり前の結果になっていますが、これが力を発揮するのは unix time を求める場合です

instant -f unix -a $(duration 2020-01-02T15:04:05Z)

f:id:mike_neck:20200712020547p:plain

これで計算を頑張らなくても良くなりました


durationinstant と同様、 java.time の機能をそのまま Java の外に持ち出したもので、 GraalVM の native-image にてネイティブバイナリー化してあります。

ビルドは github actions で行い、最近対応したとかいう手動でイベントを作れる workflow_dispatch によって、タグ付け、リリース作業を行う形にしてみました

コマンドラインのパラメーターの処理には picocli を使いましたが、 config.json の出力には picocli-codegen を使わずに graalvm-native-image plugin の config 出力機能を使いました