老师您好。在学习您的例程是遇到困惑,特来论坛向大家请教,先在此向坛子里的各位兄弟表示感谢。
一下是例程中的把秒转换为日月年的函数,其中红 {MOD}部分不理解,在是闰年,且天数为365的时候为什么年数还要加1,且天数没有减少。
//得到当前的时间
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void)
{
static u16 daycnt=0;
u32 timecount=0;
u32 temp=0;
u16 temp1=0;
timecount=RTC->CNTH;//得到计数器中的值(秒钟数)
timecount<<=16;
timecount+=RTC->CNTL;
temp=timecount/86400; //得到天数(秒钟数对应的)
if(daycnt!=temp)//超过一天了
{
daycnt=temp;
temp1=1970; //从1970年开始
while(temp>=365)
{
if(Is_Leap_Year(temp1))//是闰年
{
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
}
else temp-=365; //平年
temp1++;
}
timer.w_year=temp1;//得到年份
temp1=0;
while(temp>=28)//超过了一个月
{
if(Is_Leap_Year(timer.w_year)&&temp1==1)//当年是不是闰年/2月份
{
if(temp>=29)temp-=29;//闰年的秒钟数
else break;
}
else
{
if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
else break;
}
temp1++;
}
timer.w_month=temp1+1;//得到月份
timer.w_date=temp+1; //得到日期
}
temp=timecount%86400; //得到秒钟数
timer.hour=temp/3600; //小时
timer.min=(temp%3600)/60; //分钟
timer.sec=(temp%3600)%60; //秒钟
timer.week=RTC_Get_Week(timer.w_year,timer.w_month,timer.w_date);//获取星期
return 0;
}
这里
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
恰好是闰年而其是365天,那么年会多加1,然后继续后面的计算月份的操作。这样不是多加了一年吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
难道没有问题吗?
例如 temp1=2000,temp=365,时,
while(temp>=365)
{
if(Is_Leap_Year(temp1))//是闰年
{
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
}
else temp-=365; //平年
temp1++;
}
循环会这样走,
是闰年;
temp1++;退出循环;
此时年份temp1变为2011,而天数还是365.
之后的计算会得到13个月,最后的结果会是2001年13月1号。
---------------------------------
这个没考虑过,哪个闰年是365天的?
就是如果算出来刚好是2000年还剩365天,那不就是这种情况?
如果去掉
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
中的temp1++行不行呢?
谢谢
---------------------------------
例如整数 978220801 表示的格林尼治时间是 2000-12-31 00:00:01
但是用这段代码得到的结果是 2001-13-01 00:00:01
一周热门 更多>