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

    技术2022-05-11  129

    万年历星期的算法(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); }

    最新回复(0)