时间基准 公元0年1月1日 星期日
首先计算0年1月几号星期几
int week;//周几
int day; //日
week = (day-1)%7;
因为0年1月1 日 星期日 所以在求余的时候减去1 就可以得到一个数字 0 1 2 3 4 5 6 代表星期几
然后考虑如何计算不同年份1月几号星期几(以0年1月几号星期几为基础计算)
不考虑瑞年的情况下 一年有365天 由365%7=1 可以得出每一年的第一天和最后一天星期几是相同的 同时也就是说下一年的第一天周几要比上一年的第一天周几多1;例如0年1月1日星期日则1年1月1日就会星期一 ,每7年为一个循环,一个周期后周几又会相同,如果年份和7求余为零则周几和0年1月1日周几是相同的。例如0年1月1日和7年1月1日都是星期日。如果年份对7求余有余数,这个时候在这年份下1月几号星期几就和0年1月几号星期几不一样了,如果余数为1 0年1月星期几加1就可以得到这个年份下1月几号星期几就要加1,要是余数为 2 3 4 5 6 以此类推。
所以计算不同年份1月几号星期几的程序如下
int week;
int day;
int year; //年份
week = (day-1+year)%7;
如果考虑瑞年 瑞年有366天而366对7求余会得到余数2,说明瑞年相比于平年会让周几往后再多移一天,计算本年份之前的瑞年的个数,如果为7的倍数则没有影响 如果有余数 本年份1月几号星期几会向后移
计算瑞年的个数 程序如下
int week;
int day;
int year;
week = (day-1 + year + (year-1)/4 - (year-1)/100 + (year+4)/400)%7;
然后再考虑怎么计算不同年份不同月份不同日星期几(以1月为基础进行计算)(先不考虑瑞年)
首先先计算出其他月份和1月相比的误差
假设每个月有只有28天 因为28%7=0 所以每个月相同的号周几是相同的 然而现实是 并不是每个月都是28 天 所以就要找到修正数据来修正
======================================
月份 天数 累积 %7
1 31 0 0
2 28 3 3
3 31 3 3
4 30 6 6
5 31 8 1
6 30 11 4
7 31 13 6
8 31 16 2
9 30 19 5
10 31 21 0
11 30 24 3
12 31 26 5
=====================================
累积:是前面的所有月份和28的差的和
%7: 累积对于7求余 因为当几号加7时星期几是不变的 真正能影响星期几的是7的余数 一个月份受它前面所有月份的累积(月份天数和28的差)影响
则程序可以这样写
int week;
int year;
int day;
int month; //月份
int table[12] = {0,3,3,6,1,4,6,2,5,0,3,5}//修正数据
week = (day-1 + year + (year-1)/4 - (year-1)/100 + (year-1)/400 + table[month-1])%7;