中国农历二百年算法及年历 - 和荣笔记 - v4.15, by 杨和荣
中国公历算法
本节介绍了公历(Gregorian calendar)的算法 ,其中包括了星期的计算和闰年 的计算。
中国公历算法不是太难,关键是星期值的确定。这里给出了简单算法:
isGregorianLeapYear() 函数反回值为 True,如果输入值为闰年:
public static boolean isGregorianLeapYear(int year) { boolean isLeap = false; if (year%4==0) isLeap = true; if (year%100==0) isLeap = false; if (year%400==0) isLeap = true; return isLeap; }
dayOfYear() 函数反回值为输入日期在一年之中的天数:
public static int dayOfYear(int y, int m, int d) { int c = 0; for (int i=1; i<m; i++) { // Number of months passed c = c + daysInGregorianMonth(y,i); } c = c + d; return c; } public static int daysInGregorianMonth(int y, int m) { int d = daysInGregorianMonth[m-1]; if (m==2 && isGregorianLeapYear(y)) d++; return d; }
dayOfWeek() 函数反回值为输入日期的星期值:
public static int dayOfWeek(int y, int m, int d) { int w = 1; // 公历一年一月一日是星期一,所以起始值为星期日 y = (y-1)%400 + 1; // 公历星期值分部 400 年循环一次 int ly = (y-1)/4; // 闰年次数 ly = ly - (y-1)/100; ly = ly + (y-1)/400; int ry = y - 1 - ly; // 常年次数 w = w + ry; // 常年星期值增一 w = w + 2*ly; // 闰年星期值增二 w = w + dayOfYear(y,m,d); w = (w-1)%7 + 1; return w; }
Table of Contents