OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6517|回复: 12

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

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
发表于 2012-4-26 18:51:26 | 显示全部楼层 |阅读模式

老师您好。在学习您的例程是遇到困惑,特来论坛向大家请教,先在此向坛子里的各位兄弟表示感谢。

一下是例程中的把秒转换为日月年的函数,其中红色部分不理解,在是闰年,且天数为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,然后继续后面的计算月份的操作。这样不是多加了一年吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
 楼主| 发表于 2012-4-26 23:00:25 | 显示全部楼层

难道没有问题吗?

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

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-26 23:02:40 | 显示全部楼层
回复【楼主位】gdmgb520:
---------------------------------
这个没考虑过,哪个闰年是365天的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
 楼主| 发表于 2012-4-26 23:28:53 | 显示全部楼层

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

 

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

 

谢谢

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
 楼主| 发表于 2012-4-26 23:30:39 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
 就是如果算出来刚好是2000年还剩365天,那不就是这种情况?

 

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

 

谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-27 09:33:33 | 显示全部楼层
对的.去掉temp1++.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
 楼主| 发表于 2012-4-27 09:36:53 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
例如整数 978220801 表示的格林尼治时间是 2000-12-31 00:00:01
但是用这段代码得到的结果是 2001-13-01 00:00:01
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2012-4-26
在线时间
0 小时
 楼主| 发表于 2012-4-27 09:41:04 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢老师!
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-1-21
在线时间
1 小时
发表于 2013-1-21 15:28:29 | 显示全部楼层
回复【8楼】gdmgb520:
---------------------------------
哥们,你这看的是哪个例程啊,求链接,不知道秒值怎么转换成日历时间
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-1-21
在线时间
1 小时
发表于 2013-1-21 16:26:29 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
前辈,看了你很多例程,但是没找到这个把秒转换成日历时间的例程在哪?能给个链接看看不?谢了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-21 16:56:48 | 显示全部楼层
我们的RTC实时时钟实验就是啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-4-14 17:39:05 | 显示全部楼层
楼主看的真仔细,请教一下星期是怎么算的
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);
}
回复 支持 反对

使用道具 举报

10

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2288
金钱
2288
注册时间
2012-8-24
在线时间
247 小时
发表于 2018-10-31 17:17:05 | 显示全部楼层
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}

这里-366天,年数不用+1吗? 哪位大神解释一下,谢谢
单片机技术交流请加127034610
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 11:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表