今天,小伙伴问我,给定一个日期,能不能算出日期是本年的第几周。
这个问题瞬间让我来了兴趣,思考了一会儿,便着手编写代码了。
我的思路很简单,
- 以周一作为一周的起始点,计算元旦和周日的偏差值a
- 计算给定日期和元旦的日期差b
- 日期差b除以7,计算出元旦为周一情况下的周数c
- 日期差b除以7的余数,作为纠偏值d
- 将纠偏值d和偏差值a做比较,d>=a表示当前日期已经不在本周的范围内,周偏差值e=1,否则e=0
- 最后 c+e+1 就是我们所求的值
为什么c+e之后又+1,第一周内日期除以7的商都是0,所以+1
下面是demo
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Document</title>
<script>
function displayDate(dateStr) {
//根据传入的参数,初始化时间
var d = new Date(dateStr);
//计算传入参数时间的元旦
var year_first_day = new Date();
year_first_day.setDate(1);
year_first_day.setMonth(0);
year_first_day.setFullYear(d.getFullYear());
//时间统一设置为 00:00:00:0000,目的是为了计算结果不出现小数
d.setHours(0, 0, 0, 0);
year_first_day.setHours(0, 0, 0, 0);
//计算参数年的元旦当天是周几
var year_first_day_weekday = year_first_day.getDay();
//以每周一为一周的起始,星期天为0,替换为7,方便理解
year_first_day_weekday = year_first_day_weekday == 0 ? 7 : year_first_day_weekday;
//计算元旦距离本周结束还有几天
var week_left_days = Math.abs(year_first_day_weekday - 7) + 1;
//计算参数日期和元旦的天数差
var diff = d - year_first_day;
var diff_days = diff / 1000 / 60 / 60 / 24;
//取整,因为是上面已经有过处理,此处也可以注释
diff_days = diff_days.toFixed(0);
//计算大概周数
var week_1 = parseInt(diff_days / 7);
//天数差的余数,用来补足周数
var week_2 = diff_days % 7;
//余数和元旦周差进行对比,差值等于0,代表今天是星期一,已经是新的一周了,大于0,就不解释了
var add = week_2 >= week_left_days ? 1 : 0;
//计算实际的周数,week_1+1是因为0代表的是第一周,add是补全差值
var week = week_1 + 1 + add;
week = parseInt(week);
document.getElementById("weekidx").innerHTML = week;
}
</script>
</head>
<body>
<div align="center">
<h1>请输入日期</h1>
<p><input type="date" id="choosedate" /></p>
<p id="demo">所选日期是其所在年份的第<span id="weekidx"> </span>周</p>
<button type="button" onclick="displayDate(document.getElementById('choosedate').value)">计算</button>
</div>
</body>
</html>
当然,你也可以把周日当作一周的第一天,只需要将上面的某行代码做下小小的改动即可实现;
如果各位看官真的有这个需求的话,这个小小的改动就交给你自己做了哦