曜日を計算する関数
さて、年月日がわかっていれば、曜日は確定できる。つまり、カレンダのことだ。ならば、a年b月c日の曜日として、月曜日なら1、火曜日なら2……、土曜日なら6、日曜日なら7が計算できる式が、a, b, cを使って書けるはずである。その式に3つの数字を代入すれば、たちどころに曜日が計算できるわけだ。これがあれば、カレンダなんかいらない。何故、この曜日を求める公式、すなわち一般解が一般に普及しないのだろうか。
http://blog.mf-davinci.com/mori_log/archives/2008/01/post_1610.php
に触発されて、Javaで書いてみました。西暦ベースで年月日を渡すと、日〜土を 1〜7の数値で返します。この値は java.util.Calendarの曜日の値と同じになっています。
以下、ソース。
public class CalcWeekDay { public static int getWeekDay(int year, int month, int day) { int week = year + 10; // -(-16 + 6) week += week / 4; week += isLeepYear(year - 1)? 1: 0; switch (month) { case 12: week += 2; case 11: week += 3; case 10: week += 2; case 9: week += 3; case 8: week += 3; case 7: week += 2; case 6: week += 3; case 5: week += 2; case 4: week += 3; case 3: week += isLeepYear(year)? 1: 0; case 2: week += 3; case 1: break; } week += day - 1; return (week % 7) + 1; } public static boolean isLeepYear(int year) { return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)); } public static void main(String[] args) { for (int year = 2007; year <= 2008; year++) { for (int month = 1; month <= 12; month++) { for (int day = 1; day <= 20; day++) { final int weekDay = getWeekDay(year, month, day); System.out.println(year + "/" + month + "/" + day + ": week=" + weekDay); } } } } }