gdateが使い慣れないのでjqで日付処理をやってみた

gdateで日付出力を行おうとしてエラーだらけになるため、無難に出来ないかと模索した結果たどり着いたjqでのやり方を書いてみました。
2022.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

バッチ処理内で日付を取りたい時によくあるのが、MacではBSD系であるためにリモート環境でそのままでは使えない、というもの。大体は以下のコマンド実行後にgdateを使うケースが多いと思われます。

brew install coreutils

ポイントはgdateの作法を知る必要があるところ。人によるかもしれませんが、私の場合gdateでのフォーマット出力をスマートにこなせるのは稀です。大体画面いっぱいにエラーログが埋まるまで続きます。

もうちょっと手軽にできる方法はないかなと思っていましたが、ご存知jqでも日付出力は可能です。今回はjq本(100ページ辺り)を見ながらですが試してみました。

jqでの日時

普段はJSONを扱うときにしか触れないjqですが、日付も扱えます。

% jq -n 'now'
1649755253

とはいえ、Unixエポック時間で扱えることは稀でしょう。

% jq -n 'now | todateiso8601'
"2022-04-12T09:22:30Z"

ダブルクオートは要らないので外しておきます。

% jq -n -r 'now | todateiso8601'
2022-04-12T09:22:30Z

UTCだと使いにくいので日本時間にします。

% jq -n -r 'now | localtime | todateiso8601'
2022-04-12T18:24:47Z

時間の加算

時刻を少しずらすことも手軽です。

% jq -n 'now | localtime'
[
  2022,
  3,
  12,
  18,
  32,
  12,
  2,
  101
]

察しのつく方もいるかと思いますが、配列の各要素へたし引きを行いつつtodateiso8601で変換します。

% jq -n -r 'now | (localtime | .[1] |= .+2 | mktime) | todateiso8601'
2022-06-12T18:35:23Z

4/12現在時点で月の部分に2足してみました。月に加えて日をも編集したい場合。

jq -n -r 'now | (localtime | .[1] |= .+2 | .[2] |= .+4 |mktime) | todateiso8601'
2022-06-16T18:36:46Z

日を4日経過させてみました。要素に対して足し引きするパイプを追加するだけです。

あとがき

計算する箇所を増やすほど長くなりますが、dateコマンドにてスペース等のフォーマット崩れによるエラーが起きにくい点はメリットです。

参考にしたJQ本には他にも色々と役立つ内容が載っているので、気になる方は手に取ることをおすすめします。