热度 11
2012-5-18 16:36
1757 次阅读|
0 个评论
在门禁系统中要用到星期,但是在设置时间的时候,一般只设置年月日时分秒,不会去设置星期,那么如何根据年月日来得到星期?有一个公式: (年+年/4+年/400-年/100-年基数+月基数+日)%7=星期 余数为0是星期天,为6是星期六 注:式中分数均取整 年基数,平年1,闰年2, 月基数,1、平年:一月0, 二月3, 三月3, 四月6, 五月1, 六月4, 七月0, 八月3, 九月5, 十月0, 十一月3, 十二月5. 2、闰年:一月0, 二月3, 三月4, 四月0, 五月2, 六月5, 七月0, 八月3, 九月6, 十月1, 十一月4, 十二月6. 例如:2012-5-18是星期几 2012是闰年,年基数为2,5月的月基数为2 (2012+2012/4+2012/400-2012/100-2+2+18)%7 = (2012+503+5-20-2+2+18)%7=2518%7=5 所以2012-5-18是星期五 C程序如下: /***************************************************** *判断是否是闰年函数 *月份 1 2 3 4 5 6 7 8 9 10 11 12 *闰年 31 29 31 30 31 30 31 31 30 31 30 31 *非闰年 31 28 31 30 31 30 31 31 30 31 30 31 *输入:年份 *输出:该年份是不是闰年.1,是.0,不是 ******************************************************/ uchar Is_Leap_Year(uint year) { if(year % 4 == 0) //必须能被4整除 { if(year % 100 == 0) { if(year % 400 == 0) return 1;//如果以00结尾,还要能被400整除 else return 0; } else return 1; } else return 0; } //-------------------------------------------- uchar Get_Week(uint year,uint month,uint day) { uchar leap,week; uint y; uchar xdata mon1 = {0,3,3,6,1,4,0,3,5,0,3,5};//平年月基数 uchar xdata mon2 = {0,3,4,0,2,5,0,3,6,1,4,6};//闰年月基数 leap = Is_Leap_Year(year); if(leap) //闰年 { y = year + year / 4 + year /400 - year / 100 - 2 + mon2 + day; } else //平年 { y = year + year / 4 + year /400 - year / 100 - 1 + mon1 + day; } week = y % 7; return week; }