- カレンダー・プログラムにおけるハッピー・マンデー問題

2005/12/11/Sun.カレンダー・プログラムにおけるハッピー・マンデー問題

カレンダーのプログラムを作っている T です。こんばんは。

ツェラーの公式

単純なカレンダーなら容易に作ることができる。というか、もうできている。カレンダーを作る上で最初の障壁は閏月であるが、簡単な公式から、X年の 2月が閏月であるかどうかがわかる。

次に問題となるのが、 X年 Y月 Z日の曜日である。これには、特定の日の曜日がわかるツェラー の公式 (Zeller's fomula) というものがある。

  1. 1月もしくは 2月の場合、前年の 13月もしくは 14月として計算する。
  2. (X + (X ÷ 4 の商) - (X ÷ 100 の商) + (X ÷ 400 の商) + ((13 × Y + 8) ÷ 5 の商) + Z) ÷ 7
  3. 2. 式の余りが 0 なら日曜日、1 なら月曜日、……6 なら土曜日。

ちなみに、ツェラーの公式の有効範囲は 1583年から 3999年まで。歴史か、よほど未来の SF でも書かない限り、不自由はしない。

ハッピー・マンデー問題

ハッピー・マンデー
ハッピー・マンデーに対する見解は「ハッピー・マンデー構想改正案」を参照。

さて、ここまでは簡単にできた。しかしそれだけでは芸がないので、やはり祝祭日も特定したい。ここで頭を悩ますのがハッピー・マンデーである。ハッピー・マンデー以前なら、祝祭日は固定だったので難しくはない。祝祭日のリストと対応させれば事は済む。

祝祭日を直近の月曜日に移動させること自体は、それほど難儀ではない。が、祝祭日ごとに、ハッピー・マンデーが適用される年が違ったりするのでややこしい。例えば、成人の日は 2000年から、海の日は 2003年からである。そもそも、海の日が実施されたのは 1996年からであって、全てを計算だけで済ませるのはおよそ不可能である。

全てが自動的に行われなければ、もはやプログラムの意味がない。祝祭日の表示は諦めようかという気分になりつつある。