基姆拉尔森计算公式 推导
基姆拉尔森计算公式 推导
需求:
给定一个xxxx-xx-xx日期,计算为星期几。
设定
int y; //年
int m; //月
int d; //日
int w; //周几
从 公元0年1月1日星期日 开始
推导
对于第一个月
w = (d-1) % 7 --------- 公式(1)
对于年
- 不考虑闰年
在不考虑闰年的情况下,一年365天,365%7=1,就是说一年的第一天和最后一天是相同的。
等价于,下一年的第一天星期几是会比这一年的最后一天+1的。
完善公式(1)
w = (d-1 + y) % 7 --------- 公式(2)
- 考虑闰年
因为闰年会多出来一天,所以相当于,计算当前年份前面有多少个闰年,将日期数w额外+1
计算闰年的公式为:
y/4 - y/100 + y/400
结合之前的公式1,2
w = [d-1+y + (y-1)/4-(y-1)/100+(y-1)/400] % 7 -----公式(3)
对于其它月份
- 假设每个月都是28天
因为28%7=0,也就是说每个月的w是相同的。 - 按正常月份计算
一月是31天,比28多3天,也就是说,2月的w值,是应该比1月按28计算的往后推迟3天。
三月的值,因为二月刚好28天,不影响,相当于还是推后3天。
以此类推。
因为12月已是最后一个月,所以不用考虑12月的误差天数,同理,1月份的误差天数是0,因为前面没有月份影响它。
误差表
月 | 误差 | 累计 | 模7 |
---|---|---|---|
1 | 3 | 0 | 0 |
2 | 0 | 3 | 3 |
3 | 3 | 3 | 3 |
4 | 2 | 6 | 6 |
5 | 3 | 8 | 1 |
6 | 2 | 11 | 4 |
7 | 3 | 13 | 6 |
8 | 3 | 16 | 2 |
9 | 2 | 19 | 5 |
10 | 3 | 21 | 0 |
11 | 2 | 24 | 3 |
12 | - | 26 | 5 |
如果用一个数组记录就是
e[] = {0,3,3,6,1,4,6,2,5,0,3,5}
完善公式
w = [d-1+y + e[m-1] + (y-1)/4-(y-1)/100+(y-1)/400] % 7 --公式(4)
- 将闰年的情况考虑进去
如果是闰年的话,2月之后的都会顺移一天
w = (d-1 + y + e[m-1] + (y-1)/4 - (y-1)/100 + (y-1)/400);
if(m>2 && (y%4==0 && y%100!=0 || y%400==0) && y!=0)++w;w %= 7;
以上为基本推导过程
- 数学大佬对公式进行了优化
- W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7
转载于:https://www.cnblogs.com/SeekHit/p/7498408.html
基姆拉尔森计算公式 推导相关推荐
- C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)
C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日 ...
- C语言根据日期计算星期——基姆拉尔森计算公式
公式 基姆拉尔森计算公式 w = ( day + 2month +3(month+1)/5 + year + year/4 - year/100 +year/400)%7 根据已知公元1年1月1日星期 ...
- 基姆拉尔森计算公式(根据日期判断星期几)
//基姆拉尔森计算公式根据日期判断星期几 void CalculateWeekDay(int y, int m,int d){if(m==1||m==2) m+=12,y--;int iWeek = ...
- 根据日期判断星期几(使用基姆拉尔森计算公式)
基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与其他公式不同的 ...
- 根据年月日计算是星期几的函数,基姆拉尔森计算公式
算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与 ...
- 算法设计——基姆拉尔森计算公式:计算几月几号是星期几
基姆拉尔森计算公式 W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 其中,W表示算出的星期的数字表示:0:星期日:1:星期一-- d表示日期,m表示月份,y表示年份 ...
- 根据日期计算星期几 -- 基姆拉尔森计算公式
首先看下百度百科的基姆拉尔森计算公式定义: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y ...
- HDU 6112 今夕何夕【2017百度之星】【日期模拟计算】【基姆拉尔森计算公式】【蔡勒公式】
今夕何夕 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 蔡基姆拉尔森计算公式
用一道题目,了解这个公式: 有一个公式可以快速地根据日期计算这一天是星期几,这被称为蔡基姆拉尔森计算公式,假设星期为w,年份为y,月份为m,日期为d. w =(d+2×m+3×(m+1)/5+y+y/ ...
最新文章
- getTasksWithCompletionHandler的用法
- python_面向对象进阶之元类
- 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)
- hdfs读写流程_一文读懂HDFS分布式存储框架分析
- 在Windows宿主机中ssh连接虚拟机CentOS中的Docker容器
- xpath java html_Java根据XPath提取HTML
- Linux Ubuntu搭建git服务器
- 一个景点的给input域一个默认值,然后在聚焦的时候清空它 jquery方法
- fatal io error 11错误
- html不能默认IE浏览器,编辑告诉您win7如何设置ie为默认浏览器的完全解决办法
- unity 导入 obj 模型 和 json 数据
- 计算机网络学习笔记(持续更新)
- 油菜籽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 逻辑回归LogisticRegression
- 每日一题 | 计算松鼠的数量
- 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析
- 管理信息系统【三】之 管理信息系统技术基础
- oobe crash 分析
- JSFL_图片转换SWF导出
- 装机员Ghost Win10 RS1 1607 64位装机贺岁版2017