中國農歷二百年算法及年歷 - 和榮筆記 - v4.16,楊和榮
中國公歷算法
本節介紹了公歷(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