實現:
public class DayOfWeek {
public static int[] maxDay = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public static int dayOfWeek(int year, int month, int day) {
if (month > 12 || month < 1) {
throw new IllegalArgumentException(String.format("月份範圍爲:1-12,您的輸入爲%d", month));
}
if (!validMaxDay(year, month, day)) {
throw new IllegalArgumentException(String.format("日期超出該月最大天數,您的輸入爲%d年%d月%d號", year, month, day));
}
int y = year;
int m = month;
int d = day;
if (m <= 2) {
m += 12;
y -= 1;
}
int c;
if (y < 0) {
c = (y / 100) - 1;
y = y % 100 + 100;
} else {
c = y / 100;
y = y % 100;
}
int w;
if (year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day <= 4)) {
// 1582年10月04日及以前
w = (y + y / 4 + c / 4 - 2 * c + (13 * (m + 1)) / 5 + d + 2) % 7;
} else if (year > 1582 || (year == 1582 && month > 10) || (year == 1582 && month == 10 && day >= 15)) {
// 1582年10月15日及以後
w = (y + y / 4 + c / 4 - 2 * c + (13 * (m + 1)) / 5 + d - 1) % 7;
} else {
throw new IllegalArgumentException("1582年10月5號 到 1852年10月14號 不存在");
}
return w;
}
private static boolean validMaxDay(int year, int month, int day) {
if (month != 2) {
return day > 0 && day <= maxDay[month - 1];
} else {
int februaryMaxDay = (year % 100 == 0 ? year % 400 : year % 4) == 0 ? 29 : 28;
return day > 0 && day <= februaryMaxDay;
}
}
public static void main(String[] args) {
int i = dayOfWeek(1582, 10, 16);
System.out.println(i);
i = dayOfWeek(1582, 10, 15);
System.out.println(i);
i = dayOfWeek(1582, 10, 4);
System.out.println(i);
i = dayOfWeek(1582, 10, 3);
System.out.println(i);
System.out.println("--------");
i = dayOfWeek(0, 1, 2);
System.out.println(i);
i = dayOfWeek(0, 1, 1);
System.out.println(i);
i = dayOfWeek(-1, 12, 31);
System.out.println(i);
i = dayOfWeek(-1, 12, 30);
System.out.println(i);
System.out.println("--------");
i = dayOfWeek(1900, 1, 1);
System.out.println(i);
i = dayOfWeek(1900, 1, 2);
System.out.println(i);
i = dayOfWeek(1970, 1, 1);
System.out.println(i);
i = dayOfWeek(1970, 1, 2);
System.out.println(i);
System.out.println("***************");
i = dayOfWeek(2000, 2, 29);
System.out.println(i);
i = dayOfWeek(2004, 2, 29);
System.out.println(i);
i = dayOfWeek(2005, 2, 28);
System.out.println(i);
}
}