我遇到了麻烦。我想知道特定日期的最终日期,使用momentjs增加一定的天数,并从阵列中排除星期几。
示例:
我的日期是'2015-07-05'。我想为那个日期增加8天。所以我的最后日期是'2015-07-09'。
但我想排除我在这个阵列中的一周中的几天:[1,5,6,7](对应于ISO格式的“星期一”,“星期五”,“星期六”和“星期日”)
排除那些工作日后,我的最终日期必须是'2015-07-21'。但我无法弄清楚如何解决它。
这是一个排除星期六和星期日的功能。但我不能适应我的情况。
getFinalDate: function( date, days, excluded ){
var increment = days / Math.abs( days );
var addition = Math.ceil( Math.abs(days) / 5 ) * 7 * increment;
var date = moment( date ).add( addition, 'days' );
var remaining = days % 5;
var date = moment( date ).add( addition, 'days' );
while(remaining != 0) {
date.add(increment, 'days');
if( $.inArray( date.isoWeekday(), excluded ) == -1 )
remaining -= increment;
}
return date.format( 'YYYY-MM-DD' );
}
上述功能取自另一出版物。它工作得很完美,但我需要排除一周的工作日。
答案 0 :(得分:1)
我用稍微简单的逻辑为你重新编写了这个函数。
以下是代码:
function getFinalDate(date, days, excluded) {
var increment = days / Math.abs(days),
i = 1,
date = moment(date);
excluded = excluded || [];
do {
date.add(increment, 'days');
if (excluded.indexOf(date.isoWeekday()) === -1) {
i++;
}
} while (i < Math.abs(days));
return date.format('YYYY-MM-DD');
}
我们的想法是,在您完成超过指定数量的days
之前,您将继续增加或减少1天。但是,如果您在添加或减去日期之后,isoWeekday()
值位于排除日期列表中,请不要将其视为 n 天之一。
此处可能存在一个错误,您需要对其进行彻底的单元测试,但这样可以让您走上正确的轨道。