论坛名称:714电子实验室 网址:http://www.714e.com/bbs/
  714电子实验室提供电子技术书籍教程,电子技术视频教程,EDA软件及教程下载~
  • 万年历星期的算法(C语言) 作者:xilinxue 时间:2008-5-23 11:43:01
  • 万年历星期的算法(C语言)

    #include <stdio.h>

    code unsigned char WeekTab[] = {//闰年月星期表
      (3 << 5) + 31,//1月
      (6 << 5) + 29,//2月
      (0 << 5) + 31,//3月
      (3 << 5) + 30,//4月
      (5 << 5) + 31,//5月
      (1 << 5) + 30,//6月
      (3 << 5) + 31,//7月
      (6 << 5) + 31,//8月
      (1 << 5) + 30,//9月
      (4 << 5) + 31,//10月
      (0 << 5) + 30,//11月
      (2 << 5) + 31 //12月
    };

    /*------------------------------------------------------------------------------
    ----------
                                    2000年~2099年星期算法
    --------------------------------------------------------------------------------
    ---------*/
    unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d)
    {
    unsigned char week, day;
      day = WeekTab[m - 1];//月表
      week = day >> 5;//月星期数
      day &= 0x1f;//月天数
      if ((m < 3) && (y & 0x03)){//平年
        if (m == 2) day--;//平年月天数
        week++;//平年月表+1
      }
      y = y + (y >> 2);//年+年/4
      week = (week +  y + d + 2) % 7;//(星期=年+年/4+月表+2日)%7
      return (week << 5) | day;//返回星期和月天数
    }

    /*------------------------------------------------------------------------------
    ----------
                                    0000年~9999年星期算法
    --------------------------------------------------------------------------------
    ---------*/
    unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,
    unsigned char d)
    {
    unsigned char week, day;
      c &= 0x03;//百年%4
      c = c | (c << 2);//百年%4*5
      day = WeekTab[m - 1];//月表
      week = day >> 5;//月星期数
      day &= 0x1f;//月天数
      if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))){//平年
        if (m == 2) day--;//平年月天数
        week++;//平年月表+1
      }
      y = y + (y >> 2);//年+年/4
      week = (week + c + y + d + 2) % 7;//(星期=百年%4*5+年+年/4+月表+日+2)%7
      return (week << 5) | day;//返回星期和月天数
    }

    unsigned char BcdToBin(unsigned char val)
    {
      val = (val >> 4) * 10 + (val & 0x0f);//将BCD码转换为10进制数
      return val;//返回10进制数
    }

    void main(void)
    {
    unsigned char c, y, m, d;
    unsigned char cx, yx, mx, dx; 
    unsigned char WDay, Week, Day;
    /*---------------------------------------------------------
         0001年1月1日 星期天
    ---------------------------------------------------------*/
      c    = 0x00;
      y    = 0x01;
      m    = 0x01;
      d    = 0x01;
      cx   = BcdToBin(c);//百年
      yx   = BcdToBin(y);//年
      mx   = BcdToBin(m);//月
      dx   = BcdToBin(d);//日
      WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
      Week = WDay >> 5;//得到星期
      Day  = WDay & 0x1f;//得到最大月天数
    /*---------------------------------------------------------
         1918年1月21日 星期一
    ---------------------------------------------------------*/
      c    = 0x19;
      y    = 0x18;
      m    = 0x01;
      d    = 0x21;
      cx   = BcdToBin(c);//百年
      yx   = BcdToBin(y);//年
      mx   = BcdToBin(m);//月
      dx   = BcdToBin(d);//日
      WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
      Week = WDay >> 5;//得到星期
      Day  = WDay & 0x1f;//得到最大月天数
    /*---------------------------------------------------------
         9999年12月31日 星期天
    ---------------------------------------------------------*/
      c    = 0x00;
      y    = 0x01;
      m    = 0x01;
      d    = 0x01;
      cx   = BcdToBin(c);//百年
      yx   = BcdToBin(y);//年
      mx   = BcdToBin(m);//月
      dx   = BcdToBin(d);//日
      WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
      Week = WDay >> 5;//得到星期
      Day  = WDay & 0x1f;//得到最大月天数
    /*---------------------------------------------------------
         2004年6月18日 星期五
    ---------------------------------------------------------*/
      c    = 0x20;
      y    = 0x04;
      m    = 0x06;
      d    = 0x18;
      cx   = BcdToBin(c);//百年
      yx   = BcdToBin(y);//年
      mx   = BcdToBin(m);//月
      dx   = BcdToBin(d);//日
      WDay = WeekDay20(yx, mx, dx);//取星期和月天数
      Week = WDay >> 5;//得到星期
      Day  = WDay & 0x1f;//得到最大月天数
    /*---------------------------------------------------------
         2018年3月8日 星期四
    ---------------------------------------------------------*/
      c    = 0x20;
      y    = 0x18;
      m    = 0x03;
      d    = 0x08;
      cx   = BcdToBin(c);//百年
      yx   = BcdToBin(y);//年
      mx   = BcdToBin(m);//月
      dx   = BcdToBin(d);//日
      WDay = WeekDay20(yx, mx, dx);//取星期和月天数
      Week = WDay >> 5;//得到星期
      Day  = WDay & 0x1f;//得到最大月天数
      while(1);
    }


Google
 

欢迎光临714电子实验室 网址:http://www.714e.com/bbs/
推荐网站:
714电子实验室http://www.714e.com/