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

add days blocking days of week from array Momentjs

我有麻烦了。我想知道使用 momentjs 增加特定天数并从数组中排除星期几的特定日期的最终日期。

示例:

我有日期“2015-07-05”。我想为该日期添加 8 天。所以我的最终日期是“2015-07-09”。

但我想排除我在这个数组中的一周中的某些日子:[1,5,6,7](对应于 "monday"、"friday"、"saturday"和 "sunday" 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' );

        }

以上函数摘自另一篇文章。它工作完美,但我需要排除工作日数组。

我给你重做了函数,逻辑稍微简单了点。

代码如下:

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

我们的想法是,您不断增加或减少 1 天,直到完成超过指定数量的 days。但是,如果在您添加或减去天数后,isoWeekday() 值在您的排除天数列表中,请不要将其算作 n 天之一。

这里可能存在一个差一错误,您需要对其进行彻底的单元测试,但这应该会让您走上正轨。