找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3185|回复: 19
打印 上一主题 下一主题
收起左侧

输入年月日时分秒,计算星期几 这段单片机代码是什么算法?

[复制链接]
跳转到指定楼层
楼主
我知道单片机程序怎么走,但算法是什么,有没有依据?请教大家

星期.PNG (15.33 KB, 下载次数: 86)

星期.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-4-21 17:58 | 只看该作者
一年 按 365 天算, 则 一年有 52周 多一天, 假定,全是平年,抛开52周,那么过了多少年,就是过了天(相对于星期)所以,要计算星期,比较常用的方法,就是按照 1年加1天,闰年就多加1天的方法,来计算,把年就算完了,
到了同一年之后,你这段代码里面,就是通过 月和日通过 “表” 查出来,其实也可以 通过计算日子,然后%7算出来,看个人喜好吧。
回复

使用道具 举报

板凳
ID:777603 发表于 2022-4-21 18:27 | 只看该作者
188610329 发表于 2022-4-21 17:58
一年 按 365 天算, 则 一年有 52周 多一天, 假定,全是平年,抛开52周,那么过了多少年,就是过了天(相对 ...

我还是有点不明白……它前面确实有个月修正数组,但我不明白
回复

使用道具 举报

地板
ID:777603 发表于 2022-4-21 18:31 | 只看该作者
188610329 发表于 2022-4-21 17:58
一年 按 365 天算, 则 一年有 52周 多一天, 假定,全是平年,抛开52周,那么过了多少年,就是过了天(相对 ...

除以100,又取余。为什么21世纪又加100?
回复

使用道具 举报

5#
ID:230742 发表于 2022-4-21 18:55 | 只看该作者
以前的日期显示是881203指的是1988年,现在不同了,可能是2088年。
具体还是去百度知乎吧。比坐等快多了。
回复

使用道具 举报

6#
ID:624769 发表于 2022-4-21 19:07 | 只看该作者
黄冬梅 发表于 2022-4-21 18:31
除以100,又取余。为什么21世纪又加100?

又+100 是因为他的计算基准 是1900年开始的(即它的基准值是吧1900年作为0 开始算的所以他要得到1900年至今过了多少年),其实他是兜圈子,我的话,压根不会用YearH,

直接 yearL = year - 1900; 连 if 都不需要了。
回复

使用道具 举报

7#
ID:777603 发表于 2022-4-21 19:09 | 只看该作者
188610329 发表于 2022-4-21 19:07
又+100 是因为他的计算基准 是1900年开始的(即它的基准值是吧1900年作为0 开始算的所以他要得到1900年至 ...

懂了,现在是到月修正表不懂了
回复

使用道具 举报

8#
ID:624769 发表于 2022-4-21 19:09 | 只看该作者
黄冬梅 发表于 2022-4-21 18:27
我还是有点不明白……它前面确实有个月修正数组,但我不明白

你不明白我也没办法了, 一般计算  月日周,我都自己建数组的。也不麻烦,EXCLE里面拉一下也就出来了。用别人的还要猜,费事。
回复

使用道具 举报

9#
ID:777603 发表于 2022-4-21 19:13 | 只看该作者
188610329 发表于 2022-4-21 19:07
又+100 是因为他的计算基准 是1900年开始的(即它的基准值是吧1900年作为0 开始算的所以他要得到1900年至 ...

u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
不懂这个月修正表是什么意思。       
temp2=temp2+day+table_week[month-1];这一句代码我懂是这么多年多出来的天数和同一年的天数相加。这个月修正表是怎么计算来的,按我的逻辑是0,0……
回复

使用道具 举报

10#
ID:624769 发表于 2022-4-21 19:26 | 只看该作者
黄冬梅 发表于 2022-4-21 19:13
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
不懂这个月修正表是什么意思。       
...

这个表,代表 在1900年的时候, 每个月的 1号, 前面一天,你当作是"0号", 的星期几, 0~6  代表 星期天~星期6
回复

使用道具 举报

11#
ID:777603 发表于 2022-4-21 19:26 | 只看该作者
188610329 发表于 2022-4-21 19:09
你不明白我也没办法了, 一般计算  月日周,我都自己建数组的。也不麻烦,EXCLE里面拉一下也就出来了。用 ...

我懂了,谢谢楼主!
回复

使用道具 举报

12#
ID:777603 发表于 2022-4-21 19:31 | 只看该作者
188610329 发表于 2022-4-21 19:26
这个表,代表 在1900年的时候, 每个月的 1号, 前面一天,你当作是"0号", 的星期几, 0~6  代表 星期天~星 ...

以1900年为起点,因为1900年1月1日是星期一。计算现在的年份距离1900年有多少年,然后平年52周多1天,闰年多2天,计算得到当前年比完整的一周多了这么多天,再加上现在的天数和当前月比完整周多几天,把这三个加起来就是总的多出来的天数,由于计算年份的时候已经把闰年多出来的天数加进去了,所以当前年是闰年的话,还要在总数上减1天。
回复

使用道具 举报

13#
ID:624769 发表于 2022-4-21 19:46 | 只看该作者
黄冬梅 发表于 2022-4-21 19:31
以1900年为起点,因为1900年1月1日是星期一。计算现在的年份距离1900年有多少年,然后平年52周多1天,闰 ...

当前年是闰年的话, 你还要考虑是2月前 还是3月后, 所以这个方法是有漏洞的. 你要加好几个if去补这个漏洞,同样,因为现在202x年所以没有什么问题,比如2100年,2200年 是非闰年还要再去闰年。所以……,不知道你这个星期计算具体派什么用,万年历的话,其实没必要着折腾。2020年以前的日子其实可以根本不考虑。作出来的东西,你当她可以用20年,做一个2020~2040年每个月头一天的表,也就240个字节,直接 年*12+月, 查个表,直接出来不是更省事?
回复

使用道具 举报

14#
ID:401564 发表于 2022-4-22 10:58 | 只看该作者
你这个是基于STM32的RTC功能的吧
STM32的RTC很鸡肋的,精度取决于晶振,那就跟DS1302一个样,并没有日期和时间功能
只能通过累加有数值来计算
我看到这一个章节的内容都是直接跳过不看了
这都用STM32了,还在乎那几块钱的成本,直接加一个DS3231或者RX8025T
回复

使用道具 举报

15#
ID:777603 发表于 2022-4-22 19:14 | 只看该作者
Y_G_G 发表于 2022-4-22 10:58
你这个是基于STM32的RTC功能的吧
STM32的RTC很鸡肋的,精度取决于晶振,那就跟DS1302一个样,并没有日期和时 ...

我倒不觉得鸡肋,已经看明白了。能省则省,自带的也挺好用的
回复

使用道具 举报

16#
ID:16255 发表于 2022-4-25 11:01 | 只看该作者
188610329 发表于 2022-4-21 19:07
又+100 是因为他的计算基准 是1900年开始的(即它的基准值是吧1900年作为0 开始算的所以他要得到1900年至 ...

我也不 if 了,直接按21世纪的来计算。当前已经是21世纪了,而且我断定我的产品熬不到22世纪。
回复

使用道具 举报

17#
ID:1064915 发表于 2023-8-8 17:48 | 只看该作者
(6+WeekData[month-1]+year+day+year/4)%7
WeekData[ ]={0,3,3,6,1,4,6,2,5,0,3,5};
// year    : 00-99
回复

使用道具 举报

18#
ID:332444 发表于 2023-8-9 08:07 | 只看该作者
计算公历都是无年限的,包括星期,有年限都是不正确的,为了减少计算量,设计了自适应计算星期的函数.
回复

使用道具 举报

19#
ID:332444 发表于 2023-8-9 08:10 | 只看该作者
如下函数修改为单片机变量即可,返回值+1用7求余,无年限.
int 自适年一月一日周一值(int 年)
{//自适应跳过400倍年之前,返回1月1日是周1的值。
        return ((年 > 400 ? --年 -= 年 / 400 * 400 : 年) ? 365 * 年 + ((年 / 4) - (年 / 100) + (年 / 400)) : 0);
}
————————————————
版权声明:本文为CSDN博主「智者知已应修善业」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xianfajushi/article/details/104001986

回复

使用道具 举报

20#
ID:883242 发表于 2023-8-11 01:40 | 只看该作者
Y_G_G 发表于 2022-4-22 10:58
你这个是基于STM32的RTC功能的吧
STM32的RTC很鸡肋的,精度取决于晶振,那就跟DS1302一个样,并没有日期和时 ...

你搜下“linux mktime 源代码”,有个非常精妙的秒到日期转换算法,对于STM32的简陋RTC来说非常好用,秒到年月日小时分钟瞬间就能算出来。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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