w = (d-1 + y + e[m-1] + y/4 - y/100 + y/400); ---- 公式⑷ if(m<3 && (y%4==0 && y%100!=0 || y%400==0) && y!=0) --w; w %= 7;
与前一段代码相比,我们简化了 w 的计算部分。
实际上还可以进一步将常数 -1 合并到误差表中,但我们暂时先不这样做。
至此,我们得到了一个阶段性的算法,可以计算任一天的星期了。
public class Week { public static void main(String[] args){ int y = 2005; int m = 4; int d = 25;
int e[] = new int[]{0,3,3,6,1,4,6,2,5,0,3,5}; int w = (d-1+e[m-1]+y+(y>>2)-y/100+y/400); if(m<3 && ((y&3)==0 && y%100!=0 || y%400==0) && y!=0){ --w; } w %= 7;
测试代码如下: class test { public int GetWeek(int y, int m, int d) { if(m<3) { m += 12; --y; } int w = (d+1+2*m+3*(m+1)/5+y+(y>>2)-y/100+y/400) % 7; return w; } }
public class Week { public static void main(String[] args){ int y = 2005; int m = 1; int d = 1;
test t = new test(); String week[] = new String[]{ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" };
for(y=2005; y<=2008; y+=3) { for(m=1; m<=12; ++m) { String str = y + "-" + m + "-" + d + "\t" + week[t.GetWeek(y,m,d)]; System.out.println(str); } } } }