基姆拉尔森计算公式 推导

需求:

给定一个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

基姆拉尔森计算公式 推导相关推荐

  1. C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)

    C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日 ...

  2. C语言根据日期计算星期——基姆拉尔森计算公式

    公式 基姆拉尔森计算公式 w = ( day + 2month +3(month+1)/5 + year + year/4 - year/100 +year/400)%7 根据已知公元1年1月1日星期 ...

  3. 基姆拉尔森计算公式(根据日期判断星期几)

    //基姆拉尔森计算公式根据日期判断星期几 void CalculateWeekDay(int y, int m,int d){if(m==1||m==2) m+=12,y--;int iWeek = ...

  4. 根据日期判断星期几(使用基姆拉尔森计算公式)

    基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与其他公式不同的 ...

  5. 根据年月日计算是星期几的函数,基姆拉尔森计算公式

    算法如下:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与 ...

  6. 算法设计——基姆拉尔森计算公式:计算几月几号是星期几

    基姆拉尔森计算公式 W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 其中,W表示算出的星期的数字表示:0:星期日:1:星期一-- d表示日期,m表示月份,y表示年份 ...

  7. 根据日期计算星期几 -- 基姆拉尔森计算公式

    首先看下百度百科的基姆拉尔森计算公式定义:  基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y ...

  8. HDU 6112 今夕何夕【2017百度之星】【日期模拟计算】【基姆拉尔森计算公式】【蔡勒公式】

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. 蔡基姆拉尔森计算公式

    用一道题目,了解这个公式: 有一个公式可以快速地根据日期计算这一天是星期几,这被称为蔡基姆拉尔森计算公式,假设星期为w,年份为y,月份为m,日期为d. w =(d+2×m+3×(m+1)/5+y+y/ ...

最新文章

  1. getTasksWithCompletionHandler的用法
  2. python_面向对象进阶之元类
  3. 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)
  4. hdfs读写流程_一文读懂HDFS分布式存储框架分析
  5. 在Windows宿主机中ssh连接虚拟机CentOS中的Docker容器
  6. xpath java html_Java根据XPath提取HTML
  7. Linux Ubuntu搭建git服务器
  8. 一个景点的给input域一个默认值,然后在聚焦的时候清空它 jquery方法
  9. fatal io error 11错误
  10. html不能默认IE浏览器,编辑告诉您win7如何设置ie为默认浏览器的完全解决办法
  11. unity 导入 obj 模型 和 json 数据
  12. 计算机网络学习笔记(持续更新)
  13. 油菜籽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 逻辑回归LogisticRegression
  15. 每日一题 | 计算松鼠的数量
  16. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析
  17. 管理信息系统【三】之 管理信息系统技术基础
  18. oobe crash 分析
  19. JSFL_图片转换SWF导出
  20. 装机员Ghost Win10 RS1 1607 64位装机贺岁版2017

热门文章

  1. 天狼星-大熊座 Ursa Major SIRIUS
  2. 前端通过vue获取浏览器类型和版本最新
  3. 浏览器内核(渲染引擎)说明
  4. Harry Potter Robber
  5. 期货期权的异同(期货期权的异同点)
  6. 寻找双胞胎数 c语言,征求好的算法:输出十万以内的双胞胎素数
  7. TIM bug 总结以及应对方案
  8. 远程服务器总是自动断开连接解决办法
  9. 中金公司A股发行溢价八成:被指“收割”投资者,荣耀背后存隐忧
  10. html语言涉及到的专业,HTML语言专业学习.ppt