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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//日

相关文档
最新文档