原创 根据年月日计算星期

2012-5-18 16:36 1787 11 11 分类: MCU/ 嵌入式

在门禁系统中要用到星期,但是在设置时间的时候,一般只设置年月日时分秒,不会去设置星期,那么如何根据年月日来得到星期?有一个公式:

(年+年/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条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条