基姆拉尔森 (Kim larsen) 星期计算公式
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) 星期计算公式相关推荐
- 基姆拉尔森公式--判断星期几
An problem about date 时间限制:2000 ms | 内存限制:65535 KB 难度:2 描述 acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写 ...
- C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)
C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日 ...
- 算法设计——基姆拉尔森计算公式:计算几月几号是星期几
基姆拉尔森计算公式 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 ...
- 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 = ...
- C语言根据日期判断星期几(使用基姆拉尔森计算公式)
C语言根据日期判断星期几(使用基姆拉尔森计算公式) 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数 ...
- 根据日期判断星期几(使用基姆拉尔森计算公式)
基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公式中有个与其他公式不同的 ...
- 使用C语言根据年月日求星期(基姆拉尔森计算公式)。
题目 题目: 根据年月日求星期. 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步.--来自考研路上的lwj 一.解题思路 思路: 本题主要使用这个算法求出把算法代入程序即可: 基姆拉尔 ...
最新文章
- 利用ACS实现AAA认证
- linear model课程笔记
- sparklines插件_21个实用的Javascript数据图表插件
- java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法
- MySql和Oracle数据库的区别?
- 利用权限禁止QQ的自动升级(QQUpdateCenter)
- df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...
- 解析时分秒_部编版三年级上册语文生字表、识字表+生字解析(拼音+偏旁+结构+组词+造句)...
- 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
- matlab读取写入图像数据格式uint8,double
- 根目录下的/lib64也不能删除
- Visual C++ MSDEV.exe 应用程序错误
- 程序员面试宝典 第五版
- SPSS中K均值聚类操作案例
- 转载:医疗保险,公积金、养老、生育、工伤、失业保险
- 《Flutter 控件大全》第五十五个:InkWell和Ink
- 源码角度分析Rebuild和Rebatch
- MySQL||主键(primary key)及主键约束
- keytool运行错误
- echarts-gl 使用出现错误
热门文章
- servser 2008 web服务器 tcp响应慢,windows-server-2008 – 不明原因的慢速千兆网络速度...
- 学号 20175201张驰 《Java程序设计》第7周学习总结
- 智能化防杀未知电脑病毒探讨
- 蓝桥杯万字攻略:算法模板大放送!-c++
- 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(6)--添加控件到Flight Delay表单
- 我的世界java联机_我的世界联机教程(Java)
- 2020人工智能教育创新排行榜
- vscode保存或者格式化文档时自动转为符合eslint的格式配置
- ELO kernels 记录
- 银行卡的这些接口是什么?