javascript - 减去考虑周末的天数

标签 javascript jquery date momentjs weekend

例如,我有 4 个由日期填充的下拉菜单

["23rd December 2016","26th December 2016","27th December 2016","28th December 2016", "29th December 2016"]

在这种情况下,我希望避开周末。

每个下拉菜单的值如下

- 23rd December 2016
- 26th December 2016
- 27th December 2016
- 28th December 2016

目标是,如果我将第一个日期的值从 23 日(“星期五”)更改为 26 日(“星期一”),其他 3 个日期将更改一天为以下值;

- 26th December 2016
- 27th December 2016
- 28th December 2016
- 29th December 2016

使用以下代码可以正常工作

addWeekdays: function (date, days) {
        date = moment(date); // use a clone
        while (days > 0) {
            date = date.add(1, 'days');
            // decrease "days" only if it's a weekday.
            if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
                days -= 1;
            }
        }
return date;
}

每个下拉列表的值都会循环通过此函数,date 是下拉列表的日期值,days 是初始日期与新日期之间的天数差异日期。

我遇到的问题是,如果我尝试从 26 号转回 23 号,我不确定如何重新创建它,所以我得到以下信息;

- 23rd December 2016
- 26th December 2016
- 27th December 2016
- 28th December 2016

基本上,这是减去周末的天数差异的一种方法,因此,如果天数差异为 2,我希望从周一到上周四,而不是周六。

任何帮助将不胜感激。

最佳答案

您可以创建一个单独的 subtractWeekdays 函数,但最终会重用大部分代码。主要区别在于 date.add 中的 1 以及当 days 为负数时跳过的 while 循环。我们可以通过一些小的更改来解决此问题:

  1. 在调用时使用伪常数(为了简单起见,我将其命名为 dayConst),该常数将根据上下文为正或负,而不是硬编码的 1 日期.add
  2. 使用条件检查 days 是否为负数,如果是,则修改 dayConst 以反射(reflect)这一点,并使 days 为正数,因此 while 循环在任一情况下都会运行。

function addWeekdays (date, days) {
  // make a 'pseudo-constant' to represent the # used when adding/subtracting days
  var dayConst = 1;
  date = moment(date); // use a clone

  // add functionality for subtraction here
  if (days < 0) {
    dayConst = -1;
    days = -days;
  }

  while (days > 0) {
    // and then dayConst will be -1 if days is negative.
    date = date.add(dayConst, 'days');

    // decrease "days" only if it's a weekday.
    if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
      days -= 1;
    }
  }
  return date;
}

// How I tested them (It's Wednesday Nov 23 here and now, so 3 days +/-        
// is Monday Nov 28 and last Friday Nov 18, respectively)
console.log(addWeekdays(new Date(), 3).format("YYYY MM DD dddd"));
console.log(addWeekdays(new Date(), -3).format("YYYY MM DD dddd"));

关于javascript - 减去考虑周末的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40764978/

相关文章:

javascript - 为什么这段带有正则表达式的 JavaScript 代码不能按我的预期工作?

javascript - 函数作用域和变量进/出所述函数

javascript - jQuery get 函数无法按预期工作

r - 按日期生成排名然后传输到第二个数据框

python - 更改日期列中的年份

javascript - 使用 bootstrap 设置全屏 leaflet.js map

javascript - 对象解构 : how to use intermediate nested property

php - listView中按日期显示数据

javascript - Kendo ui 小部件加载缓慢

javascript - 如何禁用skrollr中的滚动条