请教原子老师 《RTC例程》 秒转换成日历好像有疑惑 希望大家帮忙解惑

2019-07-21 08:28发布

老师您好。在学习您的例程是遇到困惑,特来论坛向大家请教,先在此向坛子里的各位兄弟表示感谢。 一下是例程中的把秒转换为日月年的函数,其中红 {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,然后继续后面的计算月份的操作。这样不是多加了一年吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
gdmgb520
1楼-- · 2019-07-21 10:50

难道没有问题吗?

例如 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号。

正点原子
2楼-- · 2019-07-21 12:36
回复【楼主位】gdmgb520:
---------------------------------
这个没考虑过,哪个闰年是365天的?
gdmgb520
3楼-- · 2019-07-21 15:12

  就是如果算出来刚好是2000年还剩365天,那不就是这种情况?

 

如果去掉
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
中的temp1++行不行呢?

 

谢谢

gdmgb520
4楼-- · 2019-07-21 20:14
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-21 20:56
对的.去掉temp1++.
gdmgb520
6楼-- · 2019-07-21 23:58
回复【3楼】正点原子:
---------------------------------
例如整数 978220801 表示的格林尼治时间是 2000-12-31 00:00:01
但是用这段代码得到的结果是 2001-13-01 00:00:01

一周热门 更多>