本算法中引用的是由Tomohiko Sakamoto 提供的简洁函数代码
代码如下:
整体思路如下将一年看成364天(可以被7整除)
其中如果将2月看成27天
//31 27 31 30 31 30 31 31 30 31 30 31
//3 6 3 2 3 2 3 3 2 3 2 3 月天数mod7
//3 9 12 14 17 19 22 25 27 30 32 35 月数的累加和
//0 3 2 5 0 3 5 1 4 6 2 4 月数-1的累加和mod7得到数组
如1年2月某日
1月有31天被7除余3 多出的3天加到2月的天数里
最后对7取余
y/4 - y/100 + y/400 //算出到y年12月31日为止的闰年多出29号天数的个数
y + y/4 - y/100 + y/400//上市加上y年12月31日为止每年少算一天的个数
当x年y月z日时
如果月数小于2月 则应当计算y-1年多出的天数
即y -= m < 3;
y + y/4 - y/100 + y/400 + t[m-1] + d/*加上1到m-1月多出天数对7取余再加上当月的天数*/
最后对7求余的出星期。
1年1月1日为星期一
- int dayofweek(int y, int m, int d) /* 0 = Sunday */
- {
- static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
- y -= m < 3;
- return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;