Q:不翻看日历 快速通过心算计算某一天是周几 也同样适用于编程
A:Zeller公式的演变
在搜这个问题的时候 发现除了根本不贴边的回答 有些看似一本正经的回答中也有太多的胡说八道了 凤毛麟角的正确答案中说的也不太具有普适性
** 于是我很希望能稍微提高一下参与回答的门槛 至少是专业问题上 不要再让检索者自己去验证回答的正确性了 实在太耽误时间 智商不在线的还要被误导 毕竟我们很多时候想听的是答案而不是回答 没错我说的就是多数情况下极不靠谱的*度 *乎 *SDN **
通用的算法是著名的Zeller公式
这个由于对于心算来说 计算量较大 个人不太推荐 提供下面的算法
首先计算年份码
21世纪 也就是20??年之后的年份 取年份后两位 XX XX除以4取整 然后再加上XX 得到的结果除以7取余 这样可以得到年份码
20世纪 也就是 19??年到2000年间的年份码要将上述算法得到的年份码减2然后记住
1-12月
月份码
平年 : 622 503 514 624
闰年 : 512 503 514 624
注意到闰年的1月和2月的月份码实际就是平年的月份码-1得到 其余月份码和平年一致
最后用年份码加月份码加日期数除以7取余 即是星期数
例: 2017年6月15日
var r1 = parseInt(17/4);
var r2 = parseInt(17 + r1)%7;
var r3 = (r2+3+15)%7;
所以答案是周五
完整代码如下
JS
function run() {
var year = $("#year").val();
var yearInt = parseInt(year);
var yearXX = parseInt(year.substr(2, 2));
var month = parseInt($("#month").val());
var dayCode = parseInt($("#day").val());
var yearResult = parseInt(yearXX / 4);
var yearCode = (yearResult + yearXX) % 7;
var monthCode;
switch (month) {
case 1:
if ((yearInt % 4 == 0 && yearInt % 100 != 0) || (yearInt % 100 == 0 && yearInt % 400 == 0)) {
monthCode = 5;
} else {
monthCode = 6;
}
break;
case 2:
if ((yearInt % 4 == 0 && yearInt % 100 != 0) || (yearInt % 100 == 0 && yearInt % 400 == 0)) {
monthCode = 1;
} else {
monthCode = 2;
}
break;
case 3:
monthCode = 2;
break;
case 4:
monthCode = 5;
break;
case 5:
monthCode = 0;
break;
case 6:
monthCode = 3;
break;
case 7:
monthCode = 5;
break;
case 8:
monthCode = 1;
break;
case 9:
monthCode = 4;
break;
case 10:
monthCode = 6;
break;
case 11:
monthCode = 2;
break;
case 12:
monthCode = 4;
break;
}
var weekCode = (yearCode + monthCode + dayCode) % 7;
var week = "";
switch (weekCode) {
case 1:
week = "周一";
break;
case 2:
week = "周二";
break;
case 3:
week = "周三";
break;
case 4:
week = "周四";
break;
case 5:
week = "周五";
break;
case 6:
week = "周六";
break;
case 0:
week = "周天";
break;
}
console.log(week);
}
JSP
<div id = 'test'>
<input type="text" id="year">
<input type="text" id="month">
<input type="text" id="day">
<input type="button" onclick="run()">
</div>