日本語 · English

月末・月末最終営業日に実行する——cron の限界と Kairos の式

「毎月末に実行したい」は cron 最頻出の挫折点のひとつ (Stack Overflow 閲覧 32.5 万)。 Kairos ではどちらも 1 行の式になる:

monthEnd                                  # 月末日
bizDay |> within(month) |> last           # 月末最終営業日

cron で何が起きるか

根にあるのは機能の不足ではなく式が合成できないこと——「月末」を出せても、その結果を 「営業日で前へ丸める」次の規則に流せない。

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 を動かしたり、祝日を足したりして挙動を確かめられる。

関連