万年历星期的算法(C语言)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
万年历星期的算法(C语言)
#include
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);//日