久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3371|回復: 19
收起左側

輸入年月日時分秒,計算星期幾 這段單片機代碼是什么算法?

[復制鏈接]
ID:777603 發表于 2022-4-21 16:22 | 顯示全部樓層 |閱讀模式
我知道單片機程序怎么走,但算法是什么,有沒有依據?請教大家
星期.PNG
回復

使用道具 舉報

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?
回復

使用道具 舉報

ID:230742 發表于 2022-4-21 18:55 | 顯示全部樓層
以前的日期顯示是881203指的是1988年,現在不同了,可能是2088年。
具體還是去百度知乎吧。比坐等快多了。
回復

使用道具 舉報

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 都不需要了。
回復

使用道具 舉報

ID:777603 發表于 2022-4-21 19:09 | 顯示全部樓層
188610329 發表于 2022-4-21 19:07
又+100 是因為他的計算基準 是1900年開始的(即它的基準值是吧1900年作為0 開始算的所以他要得到1900年至 ...

懂了,現在是到月修正表不懂了
回復

使用道具 舉報

ID:624769 發表于 2022-4-21 19:09 | 顯示全部樓層
黃冬梅 發表于 2022-4-21 18:27
我還是有點不明白……它前面確實有個月修正數組,但我不明白

你不明白我也沒辦法了, 一般計算  月日周,我都自己建數組的。也不麻煩,EXCLE里面拉一下也就出來了。用別人的還要猜,費事。
回復

使用道具 舉報

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……
回復

使用道具 舉報

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
回復

使用道具 舉報

ID:777603 發表于 2022-4-21 19:26 | 顯示全部樓層
188610329 發表于 2022-4-21 19:09
你不明白我也沒辦法了, 一般計算  月日周,我都自己建數組的。也不麻煩,EXCLE里面拉一下也就出來了。用 ...

我懂了,謝謝樓主!
回復

使用道具 舉報

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天。
回復

使用道具 舉報

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+月, 查個表,直接出來不是更省事?
回復

使用道具 舉報

ID:401564 發表于 2022-4-22 10:58 | 顯示全部樓層
你這個是基于STM32的RTC功能的吧
STM32的RTC很雞肋的,精度取決于晶振,那就跟DS1302一個樣,并沒有日期和時間功能
只能通過累加有數值來計算
我看到這一個章節的內容都是直接跳過不看了
這都用STM32了,還在乎那幾塊錢的成本,直接加一個DS3231或者RX8025T
回復

使用道具 舉報

ID:777603 發表于 2022-4-22 19:14 | 顯示全部樓層
Y_G_G 發表于 2022-4-22 10:58
你這個是基于STM32的RTC功能的吧
STM32的RTC很雞肋的,精度取決于晶振,那就跟DS1302一個樣,并沒有日期和時 ...

我倒不覺得雞肋,已經看明白了。能省則省,自帶的也挺好用的
回復

使用道具 舉報

ID:16255 發表于 2022-4-25 11:01 | 顯示全部樓層
188610329 發表于 2022-4-21 19:07
又+100 是因為他的計算基準 是1900年開始的(即它的基準值是吧1900年作為0 開始算的所以他要得到1900年至 ...

我也不 if 了,直接按21世紀的來計算。當前已經是21世紀了,而且我斷定我的產品熬不到22世紀。
回復

使用道具 舉報

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
回復

使用道具 舉報

ID:332444 發表于 2023-8-9 08:07 | 顯示全部樓層
計算公歷都是無年限的,包括星期,有年限都是不正確的,為了減少計算量,設計了自適應計算星期的函數.
回復

使用道具 舉報

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

回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人一区av偷拍 | 国产成人精品免费视频大全最热 | 91精品在线看 | 日韩在线播放网址 | 久久久久久亚洲欧洲 | 中文字幕欧美日韩一区 | 五月激情婷婷在线 | 欧美性久久 | 免费一区二区三区 | 欧美精品被 | 久久99精品久久久97夜夜嗨 | 久久久观看 | 日韩精品在线播放 | 国产欧美精品区一区二区三区 | 色橹橹欧美在线观看视频高清 | 天堂成人国产精品一区 | 福利视频一区二区 | 国产乱码精品一区二区三区忘忧草 | 欧美亚洲在线 | 精品国产乱码久久久久久a丨 | 国产精品99久久久久久久久 | 青青草视频免费观看 | av资源网站 | a爱视频| 精品亚洲永久免费精品 | jdav视频在线观看免费 | 高清国产一区二区 | 国产精品久久久久久久久久 | 久久久精品一区二区三区 | 日本黄色片免费在线观看 | 午夜色婷婷 | 美女一级a毛片免费观看97 | 成年人免费网站 | 欧日韩在线| 欧美在线一区二区三区 | 欧美黄视频 | 成人在线精品视频 | 欧美精品一区久久 | 免费观看毛片 | 欧美成人一区二免费视频软件 | 91精品国产综合久久婷婷香蕉 |