计算具体日期星期几

时间基准 公元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;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值