OpenEdv-开源电子网

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

RTC-由年月日计算星期几

[复制链接]

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2012-9-11
在线时间
31 小时
发表于 2012-9-14 15:10:57 | 显示全部楼层 |阅读模式
 原子的代码:
 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就是算出来的日期了。
啊~~~~~~~~原子的代码这么精简,看了老半天才懂


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

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-1-2
在线时间
14 小时
发表于 2014-9-28 17:20:39 | 显示全部楼层
[mw_shl_code=c,true]u8 RTC_Get_Week(u16 year,u8 month,u8 day) { temp3=((timecount/86400)+4)%7; return(temp3); } [/mw_shl_code]

关于星期我是这样理解的,应为不管日月年时分秒,都是有时间基数timecount得到的,这里我们只是从这个基数中得到天数,天数总是准的,没有润天平天什么的,七天一循环,只要对天取余数就可以得到星期了,这里程序只用一句话就可以实现了,我用综合实验测试过! 暂时没发现问题,不知可否,求不吝赐教!
回复 支持 2 反对 0

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2012-9-11
在线时间
31 小时
 楼主| 发表于 2012-10-4 19:38:53 | 显示全部楼层
回复【5楼】overlordtony:
---------------------------------
table_week[month-1]=5,下标搞错了你
回复 支持 1 反对 0

使用道具 举报

0

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2014-6-5
在线时间
36 小时
发表于 2015-12-18 10:43:06 | 显示全部楼层
基姆拉尔森计算公式可以根据日期计算星期
回复 支持 1 反对 0

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2012-9-11
在线时间
31 小时
 楼主| 发表于 2012-9-14 15:14:20 | 显示全部楼层
这段代码的缺点就是只能在1900-2099年,日期长的话闰年的判断方法就不能只用除以4来计算了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-9-14 18:39:40 | 显示全部楼层
人才,可惜这代码不是我写的...呵呵,我也是从别处COPY过来的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-9-5
在线时间
0 小时
发表于 2012-9-17 15:49:00 | 显示全部楼层
哈哈,真的是人才呀!顶
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-7-31
在线时间
2 小时
发表于 2012-9-17 18:18:12 | 显示全部楼层

         回复【楼主位】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,吻合今天是星期一。 
不知道楼主如何理解,请赐教。谢谢!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-11-18
在线时间
0 小时
发表于 2012-11-18 18:36:46 | 显示全部楼层
这段代码会出现星期0的可能,建议加点代码把星期0给屏蔽掉~
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--;
   if((temp2%7) == 0){
                      temp2 = 7;
                      return(temp2);
   }
   else
       return(temp2%7);

}
回复 支持 反对

使用道具 举报

22

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2012-9-7
在线时间
3 小时
发表于 2012-11-19 17:16:47 | 显示全部楼层
我是这么计算星期的,先查到你的基准日期是星期几,然后读取寄存器的秒的值,然后计算过了几天,然后除以7求余数,然后计算目前是周几了,这样应该不会错吧,当然啦有局限性
回复 支持 反对

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-9-29
在线时间
16 小时
发表于 2013-8-28 17:33:26 | 显示全部楼层
回复【楼主位】apple:
请问月修正表什么意思?正确的算法不是总的天数对七求余,然后加上基准日期当天的星期数吗??
回复 支持 反对

使用道具 举报

28

主题

190

帖子

0

精华

高级会员

Rank: 4

积分
758
金钱
758
注册时间
2012-8-23
在线时间
71 小时
发表于 2013-8-28 21:39:58 | 显示全部楼层
有办法可以算任意年份某天星期几的,把从公元元年开始的每一年当作平年,计算到去年一共过了多少天,再计算公元元年到去年一共有多少个闰年,每个闰年比平年多1天,算出来的闰年数+前面的总天数+今年到今天为止过的天数,用这个总和除以7求余数,因为公元元年星期一,根据余数就知道星期几了
一介草民……
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
874
金钱
874
注册时间
2013-10-3
在线时间
23 小时
发表于 2013-11-1 06:56:44 | 显示全部楼层
赞一个,,嘿嘿
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-9
在线时间
0 小时
发表于 2014-8-24 20:21:24 | 显示全部楼层
厉害啊,字数
回复 支持 反对

使用道具 举报

9

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2014-4-3
在线时间
18 小时
发表于 2014-9-29 11:36:16 | 显示全部楼层
回复【13楼】帅的被人砍1203:
---------------------------------
之所以那么做月基数,就是为了简化方程,泰勒定理就是从一个原点开始,然后只算天数累积,之后的各种月基数延伸方法都是为了简化这个方程。
回复 支持 反对

使用道具 举报

2

主题

102

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2014-12-21
在线时间
0 小时
发表于 2015-1-24 18:16:43 | 显示全部楼层
回复【13楼】帅的被人砍1203:
---------------------------------
如果写的是calendar而非clock,这段代码还是需要的。
如果只是年月日星期简单显示,这段代码确实不是必须的;直接=((timecount/86400)+4)%7会更简单些。
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-12-18 10:08:21 | 显示全部楼层
u8 yearH,yearL;
 
 yearH=year/100; yearL=year%100; 
 // 如果为21世纪,年份数加100  
 if (yearH>19)yearL+=100;

搞不懂为什么这么绕?
看了半天就是算和1900差多少年吧,为什么不用 year-1900得到呢?

减去2001行不行?必须减1900吗?
小小蜗牛
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1056
金钱
1056
注册时间
2016-1-5
在线时间
146 小时
发表于 2016-2-9 09:30:04 | 显示全部楼层
zhanghan4310 发表于 2015-12-18 10:43
基姆拉尔森计算公式可以根据日期计算星期

同意,今早看不懂原子哥的代码,用这个公式算了下,有效
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-8-3
在线时间
31 小时
发表于 2016-9-28 21:44:30 | 显示全部楼层
正点原子 发表于 2012-9-14 18:39
人才,可惜这代码不是我写的...呵呵,我也是从别处COPY过来的。

注释太少,感觉这段代码不太妙。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-8-3
在线时间
31 小时
发表于 2016-9-28 22:05:34 | 显示全部楼层
帅的被人砍1203 发表于 2014-9-28 17:20
[mw_shl_code=c,true]u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{       
temp3=((timecount/86400)+4)%7;
...

+4是什么意思?
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2016-9-21
在线时间
11 小时
发表于 2016-10-11 16:32:15 | 显示全部楼层
帅的被人砍1203 发表于 2014-9-28 17:20
[mw_shl_code=c,true]u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{       
temp3=((timecount/86400)+4)%7;
...

我也是这想法,感觉更简单容易理解,刚才看了论坛才理解到原子程序的思想
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-4-13 16:57:41 | 显示全部楼层
一般人难以理解
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-7-26
在线时间
8 小时
发表于 2021-6-28 16:03:13 | 显示全部楼层

1970年1月1日是周四
回复 支持 反对

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-6-28 16:58:10 | 显示全部楼层
泰勒公式
回复 支持 反对

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-6-28 16:58:32 | 显示全部楼层

说错了,是蔡勒公式。。。。
回复 支持 反对

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2016-7-29
在线时间
58 小时
发表于 2024-4-16 22:16:30 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 04:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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