cpubbs 发表于 2004-11-6 02:15:35

新编万年历星期速算法C语言的实现(转贴)

<B>新编万年历星期速算法C语言的实现(hotpower)</B></P>
#include &lt;stdio.h&gt;

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

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

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

unsigned char BcdToBin(unsigned char val)
{
val = (val &gt;&gt; 4) * 10 + (val &amp; 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 &gt;&gt; 5;//得到星期
Day= WDay &amp; 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 &gt;&gt; 5;//得到星期
Day= WDay &amp; 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 &gt;&gt; 5;//得到星期
Day= WDay &amp; 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 &gt;&gt; 5;//得到星期
Day= WDay &amp; 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 &gt;&gt; 5;//得到星期
Day= WDay &amp; 0x1f;//得到最大月天数
while(1);
}
页: [1]
查看完整版本: 新编万年历星期速算法C语言的实现(转贴)