[ MEMORANDUM ]
EZ-NET 備忘録
2002/11/25 Tomohiro Kumagai
□ 特定の日時から曜日を算出する
Microsoft Visual C++ 6.0
■ はじめに
ここの備忘録は、あくまでも走り書き程度のメモ的なものですので気をつけてください。
そのままでもちゃんと動くもの、手を加えないとだめなものなど、未完成レベルのコードです。ので、そのまま引用してしまうなど、プログラムを理解する知識のない方は利用しないでくださいね。
■ 概要
今回は Zeller の公式というものを使って特定の日時から曜日を算出してみました。曜日は、0 から 6
までがそれぞれ日曜日から土曜日に対応した値として取得できます。
■ 閏年の規則
とりあえず、グレゴリオ暦では次の規則で閏年を置くことになっているようです。
- 基本的に 4 で割り切れる年は閏年とする。
- ただし、100 で割り切れる年は閏年とはしない。
- ただし、400 で割り切れる年は閏年とする。
…、とこれは余談ですけど。
■ Zeller の公式
曜日 W を求めたい日付を YYyy 年 mm 月 dd 日としたとき、次の式を用いて曜日を算出することが出来るようです。
W = [ YY/4 ] - 2YY + [ yy/4 ] + yy + [ 26(mm + 1)/10] + dd (mod 7)
ここで [ ] はガウス記号という算術記号で、その値を超えない最大の整数という意味です。
この計算式から求められた値は、次のような感じで曜日に対応します。
| W の値 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
| 対応する曜日 |
日 |
月 |
火 |
水 |
木 |
金 |
土 |
■ C++ コードと注釈
int zeller(int year, int month, int day)
{
if (month == 1 || month == 2)
{
year--;
month += 12;
}
int yH = int(year/100);
int yL = year - (yH * 100);
int week = (yH >> 2) - 2 * yH + (yL >> 2) + yL + int((month + 1) * 2.6) +
day;
return week % 7;
}