减去考虑周末的天数
Subtract days considering weekends
例如,我有 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 日 ("A Friday") 更改为 26 日 ("A Monday"),则其他 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,我想从周一到上周四而不是周六。
如有任何帮助,我们将不胜感激。
您可以将天数循环到 add/subtract
,然后跳过增量或 iterator
(如果是周末)。
function addDaysWithoutWeekends(days, date) {
var d = date || moment();
var retDate = moment(d);
var ittr = (days / Math.abs(days));
while (days !== 0) {
retDate.add(ittr, 'days');
if (!isWeekend(retDate)) {
days += (ittr * -1);
}
}
return retDate;
}
function print(d) {
console.log(d.format('DD/MM/YYYY'));
}
function isWeekend(date) {
return date.day() % 6 == 0;
}
// Add days
print(addDaysWithoutWeekends(10))
// Subtract days
print(addDaysWithoutWeekends(-10))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.0/moment.min.js"></script>
您可以创建一个单独的 subtractWeekdays
函数,但您最终会重复使用大部分代码。主要区别在于 date.add
中的 1
和 days 为负时 while 循环跳过。我们可以通过一些小改动来解决这个问题:
- 在调用 [=13= 时,使用一个伪常量(为简单起见,我将其命名为
dayConst
)根据上下文为正或负,而不是硬编码的 1
]
- 使用条件检查
days
是否为负数,如果是,则修改 dayConst
以反映这一点,并使天数为正数,以便 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"));
例如,我有 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 日 ("A Friday") 更改为 26 日 ("A Monday"),则其他 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,我想从周一到上周四而不是周六。
如有任何帮助,我们将不胜感激。
您可以将天数循环到 add/subtract
,然后跳过增量或 iterator
(如果是周末)。
function addDaysWithoutWeekends(days, date) {
var d = date || moment();
var retDate = moment(d);
var ittr = (days / Math.abs(days));
while (days !== 0) {
retDate.add(ittr, 'days');
if (!isWeekend(retDate)) {
days += (ittr * -1);
}
}
return retDate;
}
function print(d) {
console.log(d.format('DD/MM/YYYY'));
}
function isWeekend(date) {
return date.day() % 6 == 0;
}
// Add days
print(addDaysWithoutWeekends(10))
// Subtract days
print(addDaysWithoutWeekends(-10))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.0/moment.min.js"></script>
您可以创建一个单独的 subtractWeekdays
函数,但您最终会重复使用大部分代码。主要区别在于 date.add
中的 1
和 days 为负时 while 循环跳过。我们可以通过一些小改动来解决这个问题:
- 在调用 [=13= 时,使用一个伪常量(为简单起见,我将其命名为
dayConst
)根据上下文为正或负,而不是硬编码的1
] - 使用条件检查
days
是否为负数,如果是,则修改dayConst
以反映这一点,并使天数为正数,以便 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"));