月末・月末最終営業日に実行する——cron の限界と Kairos の式
「毎月末に実行したい」は cron 最頻出の挫折点のひとつ (Stack Overflow 閲覧 32.5 万)。 Kairos ではどちらも 1 行の式になる:
monthEnd # 月末日
bizDay |> within(month) |> last # 月末最終営業日
cron で何が起きるか
- 標準 cron に「月末」は無い。
28-31を並べて先頭でスクリプト判定するハックが定番で、 Kubernetes CronJob では同じ要望が issue で再提起され続けている。 - Quartz 方言の
L(最終日)・LW(最終平日)は便利だが処理系間で移植できず、祝日は扱えない (LWの W は土日回避のみ)。 - 「月末最終営業日」になると Google Calendar でも 編集不可警告つきの ICS 輸入でしか置けない。
根にあるのは機能の不足ではなく式が合成できないこと——「月末」を出せても、その結果を 「営業日で前へ丸める」次の規則に流せない。
Kairos で書く
営業日(祝日対応)の月末。@JP の標準前提(土日+日本の祝日データから導出された bizDay)で:
# eval: 2026-01-01..2026-07-01
@JP
bizDay |> within(month) |> last
#=> 2026-01-30 2026-02-27 2026-03-31 2026-04-30 2026-05-29 2026-06-30
1 月末(1/31 土)と 5 月末(5/30 土・5/31 日)が正しく金曜へ退いている。「営業日の列を作り、
月ごとに最後の点を取る」——読んだままの構造で、祝日はカレンダーデータ(covering: つき)から
来るので、データが尽きれば黙らず註釈が出る。
月末から数える変種も同じ語彙の合成:
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay) # 月末の 3 営業日前
ブラウザで試す
前提込みの自己完結形(祝日テーブルを式の中に持つ)を Playground で実行 ——from/to を動かしたり、祝日を足したりして挙動を確かめられる。
関連
- 似た型: 毎月 31 日(無い月をどうするかの二義を式で書き分ける)・第 N 営業日・N 営業日ごと ——調査研究 11 の実測節
- 語彙:
within・last・roll・shift - 祝日データの持ち込みと鮮度の統治(
covering:/asof:): 言語仕様 §4.10