原创 对3月为基月星期算法的验证

2008-8-15 18:13 2613 4 5 分类: MCU/ 嵌入式

http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=3063061



hotpower 发表于 2008-8-15 18:12 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

8楼: 对3月为基月星期算法的验证


这是我在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()
}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户461316 2008-8-20 14:41

可以学习一下!!
相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条