JavaScript - 从工作日获取两个日期之间的日期



>我收到一个开始和结束日期,我想提取这两个日期之间的所有日期,但仅限于指定的工作日。

我写了一个小代码来计算日期之间的"星期二、星期三和星期五"的日期:

start_date = "2019-12-31"
end_date = "2020-01-31"

它工作正常,但问题是它从"星期二 07-01-2020"开始计算,我想从"星期二 31-12-2019"开始获取日期。代码如下:

function nextWeekdayDate(date, day_in_week) {
var ret = new Date(date || new Date());
ret.setDate(ret.getDate() + (day_in_week - 1 - ret.getDay() + 7) % 7 + 1);
return ret;
}
var delivery_dates = []
var day_num = { "Mon": 1, "Tue": 2, "Wed": 3, "Thu": 4, "Fri": 5 };
var days_of_week = ["Tue", "Wed", "Fri"];
start_date = new Date('2019-12-31');
end_date = new Date('2020-01-31');
var new_dates = []
while (start_date < end_date) {
for (var i = 0; i <= 2; i++) {
start_date = nextWeekdayDate(start_date, day_num[days_of_week[i]]);
delivery_dates.push(start_date)
}
}
console.log(delivery_dates);

知道我的代码出了什么问题吗?这是一个jsfiddle: https://jsfiddle.net/mpe49hun/8/

由于第一个日期是星期二,因此函数

function nextWeekdayDate(date, day_in_week) {
var ret = new Date(date || new Date());
ret.setDate(ret.getDate() + (day_in_week - 1 - ret.getDay() + 7) % 7 + 1);
return ret;
}

将 7 天添加到ret时应为零

将"数学"更改为ret.setDate(ret.getDate() + ((7 + day_in_week - ret.getDay())) % 7);将解决此问题

function nextWeekdayDate(date, day_in_week) {
var ret = new Date(date || new Date());
ret.setDate(ret.getDate() + ((7 + day_in_week - ret.getDay())) % 7);
return ret;
}
var delivery_dates = []
var day_num = {
"Mon": 1,
"Tue": 2,
"Wed": 3,
"Thu": 4,
"Fri": 5
};
var days_of_week = ["Tue", "Wed", "Fri"];
start_date = new Date('2019-12-31');
end_date = new Date('2020-01-31');
var new_dates = []
while (start_date < end_date) {
for (var i = 0; i <= 2; i++) {
start_date = nextWeekdayDate(start_date, day_num[days_of_week[i]]);
delivery_dates.push(start_date)
}
}
console.log(delivery_dates);


但是,假设开始日期为 2019-12-25,例如,星期三 25/12 和星期五 27/12 将不会包含在输出中 - 如果应该包含它,那么以下代码可能是您想要的

var delivery_dates = []
var day_num = { "Mon": 1, "Tue": 2, "Wed": 3, "Thu": 4, "Fri": 5 };
var days_of_week = ["Tue", "Wed", "Fri"];
var includedDays = days_of_week.map(d => day_num[d]);
start_date = new Date('2019-12-25');
end_date = new Date('2020-01-31');
while (start_date <= end_date) {
if (includedDays.includes(start_date.getDay())) {
delivery_dates.push(new Date(start_date));
}
start_date.setDate(start_date.getDate() + 1);
}
console.log(delivery_dates)

最新更新