先讲一下大体的思路,其实很简单,就是把这段时间分成三段来计算。
即:前段不满七天的部分,中段满七天的整周部分,后段又是剩下的不满七天的部分。分别求出每段包含的周末天数即可。
getWeekDayCount(start: any, end: any) {
start = moment(start)
end = moment(end)
let isNotBefore = moment(start).isBefore(end) || start._i === end._i
if (!isNotBefore) {
return null
}
const range = moment(end).diff(moment(start));
const d = moment.duration(range);
const days = d.asDays() + 1; // 总天数
let weekendDays = 0
// 计算当前是周几
let w = moment(start).day() || 7
if (w > 5) { // 大于周五
weekendDays += Math.min(8 - w, Number(days))
} else {
if (Number(days) > 7 - w) weekendDays += 2
else if (Number(days) === 7 - w) weekendDays += 1
}
// 去除前段之后还剩下的天数
let rest = days - (8 - w)
if (rest >= 6 && rest <= 7) { // 如果剩下天数是6-7天
weekendDays += rest - 5
} else if (rest > 7) {
// 剩下的整周数
let restW = Math.floor(rest / 7)
weekendDays += restW * 2
// 去除中段之后还剩下的天数
rest -= restW * 7
if (rest >= 6 && rest <= 7) { // 如果剩下天数是6-7天
weekendDays += rest - 5
}
}
return {
weekDays: days - weekendDays,
weekendDays: weekendDays,
days: days
}
}