【问题标题】:JavaScript - Get dates in between two dates from weekdaysJavaScript - 从工作日获取两个日期之间的日期
【发布时间】:2019-12-23 08:20:33
【问题描述】:

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

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

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

它工作正常,但问题是它从“2020 年 7 月 1 日星期二”开始计算,我想从“2019 年 12 月 31 日星期二”开始计算日期。代码如下:

 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/

【问题讨论】:

  • ret.setDate(ret.getDate() + ((day_in_week - 1 - ret.getDay() + 7) % 7 + 1) % 7); 似乎可以修复它(额外的 %7)... 或者更好的 ret.setDate(ret.getDate() + ((day_in_week - 1 - ret.getDay() + 7) + 1) % 7); - 可能有更好的方法来洗牌以获得更简洁的代码
  • @JaromandaX 非常感谢。它确实解决了问题。可以解释一下为什么吗?您也可以将您的评论作为 anwser 发布,我会接受它作为解决方案。
  • ret.setDate(ret.getDate() + ((7 + day_in_week - ret.getDay())) % 7); 也这样做
  • 解释...您在第一次调用函数时添加 7 天...而不是 0,因为 start_date 是星期二
  • 如果您期望上述... jsfiddle.net/h9g1e72m - 更简单的代码,是的

标签: javascript


【解决方案1】:

因为第一个日期是星期二,所以函数

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;
}

ret 应该为零时增加 7 天

将“数学”更改为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2018-01-11
    • 2014-03-05
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多