W = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7

其中m / d / y分别代表月 (month)、日 (day)、年 (year);1月和2月对应的m是13和14,同时y相应-1

W = 1 ~ 0 分别代表着星期一 ~ 星期日;

简单的验证一下:0年1月1日(0 - 周日),1年1月1日(1 - 周一),2020年3月24日(2 - 周二)

推导(参考https://bbs.csdn.net/topics/70277519)

整个推导的核心思想,是得到y年m月1日是星期几,然后推演出y年m月中,d和W的关系!

0年1月1日是周日,则最开始一周的天数和星期数有如下对应关系:

1 - 周日(W = 0), 2 - 周一(W = 1), ......,7 - 周六(W = 6)

7天一个周期,因此对于0年的1月,有

W = (d - 1)% 7  ····················································································(1)

以一年365天计算,365 = 7 * 52 + 1,也就意味着每过一年,第一天的星期数都会增长1,因此对于y年的1月,有

W = (d - 1 + y)% 7  ···············································································(2)

闰年有366天,因此需要将y - 1年中的所有闰年考虑进来(参考上图,y年是否闰年不影响y年1月的星期数),因此,对y年的1月,有

W = (d - 1 + y + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400)% 7  ···························(3)

类似不同年之间星期数的推算,可以对不同月份的星期数做推算,m月1号 - (m - 1)月1号 = (m - 1)月天数,如果该天数是7的倍数,则W和d的推演关系不变;否则向后推延 (m - 1)月天数 % 7。以y为非闰年为例,有

m月 天数 天数 % 7 m月1日较1月1日的推延
1 31 3 0
2 28 0 3
3 31 3 3
4 30 2 6
5 31 3 8 -> 1
6 30 2 4
7 31 3 6
8 31 3 9 -> 2
9 30 2 5
10 31 3 7 -> 0
11 30 2 3
12 31 3 5

偏差e = {0,3,3,6,1,4,6,2,5,0,3,5} (y非闰年)

W = (d - 1 + y + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + e [m - 1])% 7  ··········(4)

但此时,对于y是闰年的情况,又会得到新的一组e;此时W的公式取决于y是否为闰年。为了避免分情况讨论的繁琐,一个机智的做法是将N年的1月和2月并入N-1年,作为13月和14月。在此基础上,我们重新推导:

============================ 我是分割线 ============================

0年3月1日是周三,则最开始一周的天数和星期数有如下对应关系:

1 - 周三(W = 3), 2 - 周四(W = 4), ......,7 - 周二(W = 2)

7天一个周期,因此对于0年的3月,有

W = (d + 2)% 7  ····················································································(1)

以一年365天计算,365 = 7 * 52 + 1,也就意味着每过一年,第一天的星期数都会增长1,因此对于y年的3月,有

W = (d + 2 + y)% 7  ··············································································(2)

闰年有366天,因此需要将y年中的所有闰年考虑进来(参考上图,y年是否闰年影响y年3月的星期数),因此,对y年的3月,有

W = (d + 2 + y + y / 4 - y / 100 + y / 400)% 7  ···························(3)

类似不同年之间星期数的推算,可以对不同月份的星期数做推算,m月1号 - (m - 1)月1号 = (m - 1)月天数,如果该天数是7的倍数,则W和d的推演关系不变;否则向后推延 (m - 1)月天数 % 7。

m月 天数 天数 % 7 m月1日较3月1日的推延
3 31 3 0
4 30 2 3
5 31 3 5
6 30 2 8 -> 1
7 31 3 3
8 31 3 6
9 30 2 9 -> 2
10 31 3 4
11 30 2 7 -> 0
12 31 3 2
13 31 3 5
14 28 / 29 0 / 1 8 -> 1

可以发现,y年是否为闰年,偏差均为e = {0,3,5,1,3,6,2,4,0,2,5,1} 。注意,e的最后两个值对应y+1年的1月和2月,这里暂不作讨论。对于y年3~12月,均有

W = (d + 2 + y + y / 4 - y / 100 + y / 400 + e[m - 3])% 7  ····································(4)

令x = m - 3,则e[x] = [2 * (x + 3) + 3 * (x + 4) / 5 - 1] % 7,因此有 e[m - 3] = 2 * m + 3 * (m + 1) / 5 - 1,因此,对于y年3~12月,有

W = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400)% 7  ········(5)

而对于y年的1~2月,将其作为y - 1年的13~14月来求解,则会发现y年是否是闰年,只会影响y - 1年14月的天数,对y - 1年13月和14月的星期数求解并无影响。

令x = m - 3,对于m=13和14的情况,仍有e[x] = [2 * (x + 3) + 3 * (x + 4) / 5 - 1] % 7,因此有 e[m - 3] = 2 * m + 3 * (m + 1) / 5 - 1。所以以下求解式对所有情况都通用:)

W = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7

基姆拉尔森 (Kim larsen) 星期计算公式相关推荐

  1. 基姆拉尔森公式--判断星期几

    An problem about date 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 使用C语言根据年月日求星期(基姆拉尔森计算公式)。

    题目 题目: 根据年月日求星期. 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步.--来自考研路上的lwj 一.解题思路 思路: 本题主要使用这个算法求出把算法代入程序即可: 基姆拉尔 ...

最新文章

  1. 利用ACS实现AAA认证
  2. linear model课程笔记
  3. sparklines插件_21个实用的Javascript数据图表插件
  4. java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法
  5. MySql和Oracle数据库的区别?
  6. 利用权限禁止QQ的自动升级(QQUpdateCenter)
  7. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...
  8. 解析时分秒_部编版三年级上册语文生字表、识字表+生字解析(拼音+偏旁+结构+组词+造句)...
  9. 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
  10. matlab读取写入图像数据格式uint8,double
  11. 根目录下的/lib64也不能删除
  12. Visual C++ MSDEV.exe 应用程序错误
  13. 程序员面试宝典 第五版
  14. SPSS中K均值聚类操作案例
  15. 转载:医疗保险,公积金、养老、生育、工伤、失业保险
  16. 《Flutter 控件大全》第五十五个:InkWell和Ink
  17. 源码角度分析Rebuild和Rebatch
  18. MySQL||主键(primary key)及主键约束
  19. keytool运行错误
  20. echarts-gl 使用出现错误

热门文章

  1. servser 2008 web服务器 tcp响应慢,windows-server-2008 – 不明原因的慢速千兆网络速度...
  2. 学号 20175201张驰 《Java程序设计》第7周学习总结
  3. 智能化防杀未知电脑病毒探讨
  4. 蓝桥杯万字攻略:算法模板大放送!-c++
  5. 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(6)--添加控件到Flight Delay表单
  6. 我的世界java联机_我的世界联机教程(Java)
  7. 2020人工智能教育创新排行榜
  8. vscode保存或者格式化文档时自动转为符合eslint的格式配置
  9. ELO kernels 记录
  10. 银行卡的这些接口是什么?