米国の選挙日・ブラックフライデー・感謝祭の次の日曜——計算で決まる日を基準にした相対日
米国の選挙日は「11 月の第 1 月曜の翌日の火曜」、感謝祭は「11 月の第 4 木曜」、ブラックフライデーは その翌日、サイバーマンデーはその次の月曜。どれも「別の規則で決まる日から n 日」という形で、法律や慣習は その順に言葉で定義している。Kairos ではその言葉の順にそのまま書ける——先に決まる日を導き、その列を次の 規則の入力にする(閉包)。
既存の繰り返し規則で何が起きるか
- RRULE には「別規則の日 + n 日」が無い。選挙日は
BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8(火曜で、かつ 2〜8 日) という意図の消えた符号化でしか書けない——読んだ人が「第 1 月曜の翌日」に戻せない。 - 「感謝祭の次の日曜」は月を跨ぐ年(2024 年は 12/1)があり、BYYEARDAY の負値で数えるハックは月跨ぎで破綻する。
- cron は曜日と日を OR で結ぶため、この種の条件はそもそも書けない(レシピ: 月末最終営業日 の冒頭を参照)。
Kairos で書く——法律の言葉の順に
選挙日=「11 月の第 1 月曜」を年の窓で選び、その翌日:
# eval: 2024-01-01..2029-01-01 tz: America/New_York
premise US {
calendar-system: Gregorian
tz: "America/New_York"
wkst: Sun
}
@US
firstMonNov = everyDay |> filter(d => weekday(d) == Mon and month(d) == 11) |> within(year) |> first
firstMonNov |> shift(+1, unit: day)
#=> 2024-11-05 2025-11-04 2026-11-03 2027-11-02 2028-11-07
連邦選挙は偶数年だけなので、年の射影で絞れば「連邦選挙日」になる(奇数年は州・地方の選挙日):
# eval: 2024-01-01..2031-01-01 tz: America/New_York
premise US {
calendar-system: Gregorian
tz: "America/New_York"
wkst: Sun
}
@US
firstMonNov = everyDay |> filter(d => weekday(d) == Mon and month(d) == 11) |> within(year) |> first
firstMonNov |> shift(+1, unit: day) |> filter(d => year(d) mod 2 == 0)
#=> 2024-11-05 2026-11-03 2028-11-07 2030-11-05
ブラックフライデー=感謝祭(11 月の第 4 木曜)の翌日。感謝祭を束縛しておけば一行:
# eval: 2024-01-01..2028-01-01 tz: America/New_York
premise US {
calendar-system: Gregorian
tz: "America/New_York"
wkst: Sun
}
@US
thanksgiving = everyDay |> filter(d => weekday(d) == Thu and month(d) == 11) |> within(month) |> nth(4)
thanksgiving |> shift(+1, unit: day)
#=> 2024-11-29 2025-11-28 2026-11-27 2027-11-26
サイバーマンデー=感謝祭の 4 日後:
# eval: 2024-01-01..2028-01-01 tz: America/New_York
premise US {
calendar-system: Gregorian
tz: "America/New_York"
wkst: Sun
}
@US
thanksgiving = everyDay |> filter(d => weekday(d) == Thu and month(d) == 11) |> within(month) |> nth(4)
thanksgiving |> shift(+4, unit: day)
#=> 2024-12-02 2025-12-01 2026-11-30 2027-11-29
感謝祭の次の日曜=感謝祭から日曜へ前方ロール。2024 年は 12/1——月跨ぎが正しく出る(導いた列を次の 規則の入力にしているので、月の境界は関係ない):
# eval: 2024-01-01..2028-01-01 tz: America/New_York
premise US {
calendar-system: Gregorian
tz: "America/New_York"
wkst: Sun
}
@US
thanksgiving = everyDay |> filter(d => weekday(d) == Thu and month(d) == 11) |> within(month) |> nth(4)
thanksgiving |> roll(Following, on: (everyDay |> filter(d => weekday(d) == Sun)))
#=> 2024-12-01 2025-11-30 2026-11-29 2027-11-28
射程の明示
- 選挙日の定義は連邦法(2 U.S.C. §7・3 U.S.C. §1)の「11 月の第 1 月曜の次の火曜」。感謝祭は 5 U.S.C. §6103 の 「11 月の第 4 木曜」。ブラックフライデーとサイバーマンデーは法定休日ではなく小売の慣習。
- 州・地方の選挙日や早期投票期間は州法で別に決まる——本ページの式は連邦の定義だけを扱う。
- 例の premise は米国東部時間。日付だけの定義なので tz は結果を変えない(Playground の表示 tz と揃えてある)。
ブラウザで試す
選挙日・ ブラックフライデー・ サイバーマンデー・ 感謝祭の次の日曜