从数组Momentjs添加阻止星期几的天数

时间:2015-07-06 02:20:19

标签: javascript date momentjs

我遇到了麻烦。我想知道特定日期的最终日期,使用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' );

        }

上述功能取自另一出版物。它工作得很完美,但我需要排除一周的工作日。

1 个答案:

答案 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 天之一。

此处可能存在一个错误,您需要对其进行彻底的单元测试,但这样可以让您走上正确的轨道。