原子的代码:
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{
u16 temp2;
u8 yearH,yearL;
yearH=year/100; yearL=year%100;
// 如果为21世纪,年份数加100
if (yearH>19)yearL+=100;
// 所过闰年数只算1900年之后的
temp2=yearL+yearL/4;
temp2=temp2%7;
temp2=temp2+day+table_week[month-1];
if (yearL%4==0&&month<3)temp2--;
return(temp2%7);
}
先来看一下月修正数据表 table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};假设1月1日是星期一,那么2月1日是星期四,(4-1=3),故是3,3月1日是星期四,(4-1=3),4月1日是星期日(7-1=6);这样依次类推。前提是这一年是平年。
yearH=year/100; yearL=year%100;
// 如果为21世纪,年份数加100
if (yearH>19)yearL+=100; 这几行算出本年和1900年之差
temp2=yearL+yearL/4; year/4是闰年的年数,平年一年365天,365%7=1;temp2算出自1900年以来积累的多出来的天数;
temp2=temp2+day+table_week[month-1];//算出当天比1900年1月1日多出来的天数,并不是实际多出来的,table_week[month-1]已经除过7了
if (yearL%4==0&&month<3)temp2--;如果是润年1月,2月的话要减去一,因为yearL/4已把当年多出来的一天计算进去了,多出来的一天是在三月份以后才能加的
temp%7就是算出来的日期了。
啊~~~~~~~~原子的代码这么精简,看了老半天才懂
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
关于星期我是这样理解的,应为不管日月年时分秒,都是有时间基数timecount得到的,这里我们只是从这个基数中得到天数,天数总是准的,没有润天平天什么的,七天一循环,只要对天取余数就可以得到星期了,这里程序只用一句话就可以实现了,我用综合实验测试过! 暂时没发现问题,不知可否,求不吝赐教!
回复【楼主位】apple:
---------------------------------
正好有个疑问请教一下楼主:
table_week[month-1]是要进行月份减一吗??
比如:2012年9月17日代入式temp2=temp2+day+table_week[month-1]=0+17+2(进行month-1了)由此算出是星期五。
如果月份不减1:0+17+5=22%7余1,吻合今天是星期一。
不知道楼主如何理解,请赐教。谢谢!
一周热门 更多>