在门禁系统中要用到星期,但是在设置时间的时候,一般只设置年月日时分秒,不会去设置星期,那么如何根据年月日来得到星期?有一个公式:
(年+年/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[12] = {0,3,3,6,1,4,0,3,5,0,3,5};//平年月基数
uchar xdata mon2[12] = {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[month - 1] + day;
}
else //平年
{
y = year + year / 4 + year /400 - year / 100 - 1 + mon1[month - 1] + day;
}
week = y % 7;
return week;
}
文章评论(0条评论)
登录后参与讨论