【目的】
年月日関連アルゴリズムの考察。
【前提】
大抵の環境、プログラム言語には年月日演算処理(ライブラリ、標準関数)が用意されている。
従って、例えば 日 + 1
は単純な足し算ではなく、その環境で用意されている標準関数を通して加算するものとする。
【月度の求め方】
仮に締め日を 20日とし、1月1日~20日は 1月度、1月21日~末日は 2月度とする。
月日から月度を求める方法は幾つか考えられる。
前述の仕様をそのままコードに起こせば以下になる。
if (月日の日 <= 20) {
月度 = 月日の月;
} else {
月度 = 月日の月 + 1;
}
しかし式で書けば以下のようにシンプル。条件分岐は不要。
月度 = (月日 - 20日 + 1ヶ月) の月;
【年度の求め方】
こちらはもっと簡単。
年度 = (年月 - 3ヶ月) の年;
【末日の求め方】
ついでに。こちらは有名か。
末日 = (年月日の翌月の1日) - 1日;
【アメリカ大統領選挙日のアルゴリズム】
アメリカの大統領選挙日は原則 11月の第1火曜日。
しかし、もしそれが 1日だと月初で色々とアレなので翌週の火曜日となる。
この選挙日が法律上、どのように定義されているかご存じだろうか?
それは以下。実に単純明快。
11月の第1月曜日の翌日の火曜日に設置される。
素晴らしい、素晴らし過ぎる。
単に「11月の第1月曜日の翌日」でも良い。
「翌日」であるから 1日はあり得ない。
月曜日の翌日は火曜日であることは自明。
このアルゴリズムの面白いところは、火曜日の定義なのに「火曜日」が含まれない(含めなくても良い)こと。
これが 150年も前に制定されているという。昔の人は頭が良かったんだねぇ(小並感)。
年月日アルゴリズムの良いお手本として記憶に留めたい。