51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
万年历星期的算法(C语言)
发布时间:2009/6/4  阅读次数:651  字体大小: 【】 【】【

作者:    来源:互联网

万年历星期的算法(C语言)

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);
}
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号