这是我在GPS中的星期算法应用源程序 /*---------------------------------------------------------------------------------------- 0000年~9999年星期算法 -----------------------------------------------------------------------------------------*/ unsigned int RtcObj::GetDow(unsigned int y, unsigned int m, unsigned int d) { unsigned int w, c; if (m <= 2) { m |= 4;//1月2月同5月六月表 y--;//1月2月的年为"去年" //若年不为0年时,下列4行可不要 if (y >= 0x8000)//负数 { y = 399;//上个4百年的最后1年 } } c = y / 100; c &= 0x03;//百年%4 y %= 100; //(星期=百年%4*5+年+年/4+(13*月+8)/5+日)%7,特别注意1月2月的年为"去年" w = ((c | (c << 2)) + (y + (y >> 2)) + (13 * m + 8)/ 5 + d) % 7; return w;//返回星期 }
/*---------------------------------------------------------------------------------------- 0000年~9999年月最大天数算法 -----------------------------------------------------------------------------------------*/ unsigned int RtcObj::GetDom(unsigned int y, unsigned int m) { unsigned int dn; dn = GetDow(y, m + 1, 1) - GetDow(y, m, 1);//m+1=13表示明年的1月 if (dn >= 0x8000)//负数 { dn += 7; } return dn + 28;//返回当月的最大天数 }
下列是刚验证通过的: int main (void) { volatile unsigned int week; volatile unsigned int day;
day = Rtc.GetDom( 0, 2); // 0.02 29天(闰年) day = Rtc.GetDom( 1, 2); // 1.02 28天(平年) day = Rtc.GetDom( 2, 2); // 2.02 28天(平年) day = Rtc.GetDom( 3, 2); // 3.02 28天(平年) day = Rtc.GetDom( 4, 2); // 4.02 29天(闰年) day = Rtc.GetDom( 100, 2); // 100.02 28天(平年) day = Rtc.GetDom( 200, 2); // 200.02 28天(平年) day = Rtc.GetDom( 300, 2); // 300.02 28天(平年) day = Rtc.GetDom( 400, 2); // 400.02 29天(闰年) day = Rtc.GetDom( 401, 2); // 401.02 28天(平年) day = Rtc.GetDom( 500, 2); // 500.02 28天(平年) day = Rtc.GetDom( 600, 2); // 600.02 28天(平年) day = Rtc.GetDom( 700, 2); // 700.02 28天(平年) day = Rtc.GetDom( 800, 2); // 800.02 29天(闰年)
week = Rtc.GetDow(1999, 1, 1);//1999.01.01 星期五 week = Rtc.GetDow(1999, 2, 1);//1999.02.01 星期一 week = Rtc.GetDow(1999, 3, 1);//1999.03.01 星期一
day = Rtc.GetDom(1999, 2); //1999.02 28天(平年)
week = Rtc.GetDow(2000, 1, 1);//2000.01.01 星期六 week = Rtc.GetDow(2000, 2, 1);//2000.02.01 星期二 week = Rtc.GetDow(2000, 3, 1);//2000.03.01 星期三
day = Rtc.GetDom(2000, 2); //2000.02 29天(闰年)
week = Rtc.GetDow(2001, 1, 1);//2001.01.01 星期一 week = Rtc.GetDow(2001, 2, 1);//2001.02.01 星期四 week = Rtc.GetDow(2001, 3, 1);//2001.03.01 星期四
day = Rtc.GetDom(2001, 2); //2001.02 28天(平年)
week = Rtc.GetDow(2007, 1, 1);//2007.01.01 星期一 week = Rtc.GetDow(2007, 2, 1);//2007.02.01 星期四 week = Rtc.GetDow(2007, 3, 1);//2007.03.01 星期四
day = Rtc.GetDom(2007, 1); //2007.01 31天 day = Rtc.GetDom(2007, 2); //2007.02 28天(平年) day = Rtc.GetDom(2007, 3); //2007.03 31天 day = Rtc.GetDom(2007, 4); //2007.04 30天 day = Rtc.GetDom(2007, 5); //2007.05 31天 day = Rtc.GetDom(2007, 6); //2007.06 30天 day = Rtc.GetDom(2007, 7); //2007.07 31天 day = Rtc.GetDom(2007, 8); //2007.08 31天 day = Rtc.GetDom(2007, 9); //2007.09 30天 day = Rtc.GetDom(2007, 10); //2007.10 31天 day = Rtc.GetDom(2007, 11); //2007.11 30天 day = Rtc.GetDom(2007, 12); //2007.12 31天
week = Rtc.GetDow(2008, 1, 1);//2008.01.01 星期二 week = Rtc.GetDow(2008, 2, 1);//2008.02.01 星期五 week = Rtc.GetDow(2008, 3, 1);//2008.03.01 星期六
week = Rtc.GetDow(2008, 8, 8);//2008.08.08 星期五 week = Rtc.GetDow(2008, 8,15);//2008.08.15 星期五(今天) week = Rtc.GetDow(2008, 8,16);//2008.08.16 星期六
day = Rtc.GetDom(2008, 1); //2008.01 31天 day = Rtc.GetDom(2008, 2); //2008.02 29天(闰年) day = Rtc.GetDom(2008, 3); //2008.03 31天 day = Rtc.GetDom(2008, 4); //2008.04 30天 day = Rtc.GetDom(2008, 5); //2008.05 31天 day = Rtc.GetDom(2008, 6); //2008.06 30天 day = Rtc.GetDom(2008, 7); //2008.07 31天 day = Rtc.GetDom(2008, 8); //2008.08 31天 day = Rtc.GetDom(2008, 9); //2008.09 30天 day = Rtc.GetDom(2008, 10); //2008.10 31天 day = Rtc.GetDom(2008, 11); //2008.11 30天 day = Rtc.GetDom(2008, 12); //2008.12 31天
week = Rtc.GetDow(2009, 1, 1);//2009.01.01 星期四 week = Rtc.GetDow(2009, 2, 1);//2009.02.01 星期天 week = Rtc.GetDow(2009, 3, 1);//2009.04.01 星期天
day = Rtc.GetDom(2009, 2); //2009.02 28天(平年)
week = Rtc.GetDow(2100, 1, 1);//2100.01.01 星期五 week = Rtc.GetDow(2100, 2, 1);//2100.02.01 星期一 week = Rtc.GetDow(2100, 3, 1);//2100.03.01 星期一
day = Rtc.GetDom(2100, 2); //2100.02 28天(平年)
week = Rtc.GetDow(2200, 1, 1);//2200.01.01 星期三 week = Rtc.GetDow(2200, 2, 1);//2200.02.01 星期六 week = Rtc.GetDow(2200, 3, 1);//2200.03.01 星期六
day = Rtc.GetDom(2200, 2); //2200.02 28天(平年)
week = Rtc.GetDow(2300, 1, 1);//2300.01.01 星期一 week = Rtc.GetDow(2300, 2, 1);//2300.01.01 星期四 week = Rtc.GetDow(2300, 3, 1);//2300.01.01 星期四
day = Rtc.GetDom(2300, 2); //2300.02 28天(平年)
week = Rtc.GetDow(2400, 1, 1);//2400.01.01 星期六 week = Rtc.GetDow(2400, 2, 1);//2400.02.01 星期二 week = Rtc.GetDow(2400, 3, 1);//2400.03.01 星期三
day = Rtc.GetDom(2400, 2); //2400.02 29天(闰年)
os_sys_init (MainTask);//启动ARTX,此函数并不返回main() } |