根據年月日獲取星期

 

蔡勒公式

實現:

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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章