gdateが使い慣れないのでjqで日付処理をやってみた
バッチ処理内で日付を取りたい時によくあるのが、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本には他にも色々と役立つ内容が載っているので、気になる方は手に取ることをおすすめします。