この記事は公開されてから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本には他にも色々と役立つ内容が載っているので、気になる方は手に取ることをおすすめします。