日本語 · English

米国の選挙日・ブラックフライデー・感謝祭の次の日曜——計算で決まる日を基準にした相対日

米国の選挙日は「11 月の第 1 月曜の翌日の火曜」、感謝祭は「11 月の第 4 木曜」、ブラックフライデーは その翌日、サイバーマンデーはその次の月曜。どれも「別の規則で決まる日から n 日」という形で、法律や慣習は その順に言葉で定義している。Kairos ではその言葉の順にそのまま書ける——先に決まる日を導き、その列を次の 規則の入力にする(閉包)。

既存の繰り返し規則で何が起きるか

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

射程の明示

ブラウザで試す

選挙日ブラックフライデーサイバーマンデー感謝祭の次の日曜

関連