notebook

都内でWEB系エンジニアやってます。

jqで曜日判定をする

jqで土日を判定するみたいなことができる

isoの日付からfromdateでunixタイムスタンプへ変換しそれをgmtimeへ渡すと日時に関する配列が返ってくる

その中に曜日の情報も含まれている

よくある2020-08-01のような形式のテキストを判定してみる

$  echo '{"start_date": "2020-08-01"}'| jq '.start_date+"T00:00:00Z"'
"2020-08-01T00:00:00Z"

$ echo '{"start_date": "2020-08-01"}'| jq '.start_date+"T00:00:00Z"|fromdate'
1596240000

$ echo '{"start_date": "2020-08-01"}'| jq '.start_date+"T00:00:00Z"|fromdate|gmtime'
[
  2020, # 年
  7, # 月(0~)
  1, # 日
  0, # 時
  0, # 分
  0, # 秒
  6, # 曜日
  213 # 通年での日数
]

年、月(0~)、日、時、分、秒、曜日、通年での日数

といった感じで取得できるよう

日曜が0で土曜が6

休日と平日で集計する

試しに簡単な例を用意して集計してみる

  • sample.json
$ cat sample.json
[
  {"date": "2020-08-01", "time": 1},
  {"date": "2020-08-02", "time": 1},
  {"date": "2020-08-03", "time": 1},
  {"date": "2020-08-04", "time": 1},
  {"date": "2020-08-05", "time": 1},
  {"date": "2020-08-06", "time": 1},
  {"date": "2020-08-07", "time": 1},
  {"date": "2020-08-08", "time": 1},
  {"date": "2020-08-09", "time": 1},
  {"date": "2020-08-10", "time": 1}
]
$ cat sample.json| jq 'reduce .[] as $row ({}; .[$row.date+"T00:00:00Z"|fromdate|gmtime|map(in([6,0]))|.[6]|tostring] += $row.time)'
{
  "false": 6,
  "true": 4
}

サンプルなのでここまで

falseは平日、trueは休日の合計ということになる