做项目遇到这个问题,说一下我的解决思路:
- 已知:一周固定7天,一个月的天数可获取,1年12个月。
- 计算方法:通过星期几就能知道在日期前后加减多少天数,比如2021-01-04和星期一,则4需要-1天和+5天,即2021/01/03-2021/01/09,返回20210103-20210109。但是遇到跨月或者跨年跨月的周期范围需要注意一下。减后的值小于1和加后的值大于某个月的天数都是跨月或者跨年跨月的情况。
- 实现:参数:日期和星期几。返回值:字符串类型的日期范围。
const computeDateRange = (week, day) => {
if (!week || !day) return;
const dayArr = day.toString().split('-'),
theDay = Number(dayArr[2]),
n = new Date(dayArr[0], dayArr[1], 0),
dayMax = n.getDate(); //获取某月的天数
let str1 = 0, str2 = 0,
m = Number(dayArr[1]),
y = Number(dayArr[0]),
finalStr;
const newN = new Date(y, m - 1, 0),
newDayMax = newN.getDate(); //获取某月下个月的天数
const paddedDigits = (num) => {
return num < 10 ? `0${num}` : num;
}
switch (week) {
case 'Sun':
case 7:
str1 = theDay;
str2 = theDay + 6;
break;
case 'Mon':
case 1:
str1 = theDay - 1;
str2 = theDay + 5;
break;
case 'Tue':
case 2:
str1 = theDay - 2;
str2 = theDay + 4;
break;
case 'Wed':
case 3:
str1 = theDay - 3;
str2 = theDay + 3;
break;
case 'Thu':
case 4:
str1 = theDay - 4;
str2 = theDay + 2;
break;
case 'Fri':
case 5:
str1 = theDay - 5;
str2 = theDay + 1;
break;
case 'Sat':
case 6:
str1 = theDay - 6;
str2 = theDay;
break;
default:
break;
}
// 1月第一周跨月
if (str1 < 1 && m - 1 < 1) {
str1 = newDayMax + str1;
finalStr = `${y - 1}12${paddedDigits(str1)}-${y}01${paddedDigits(str2)}`;
}
// 跨上个月的周期
else if (str1 < 1 && m - 1 > 1) {
str1 = newDayMax + str1;
m = m < 10 ? `0${m}` : m;
finalStr = `${y}${paddedDigits(m - 1)}${paddedDigits(str1)}-${y}${paddedDigits(m)}${paddedDigits(str2)}`;
}
// 12月最后一周跨月
else if (str2 > dayMax && m + 1 > 12) {
str2 = str2 - dayMax;
finalStr = `${y}12${paddedDigits(str1)}-${y + 1}01${paddedDigits(str2)}`;
}
// 跨下个月的周期
else if (str2 > dayMax && m + 1 < 12) {
str2 = str2 - dayMax;
finalStr = `${y}${paddedDigits(m)}${paddedDigits(str1)}-${y}${paddedDigits(m + 1)}${paddedDigits(str2)}`;
}
// 某一个月内的周期
else {
finalStr = `${y}${paddedDigits(m)}${paddedDigits(str1)}-${y}${paddedDigits(m)}${paddedDigits(str2)}`;
}
return finalStr;
}
computeDateRange(1, '2021-01-04');
computeDateRange('Mon', '2021-01-04');