计算没有重叠的日期范围的持续时间

时间:2016-09-13 09:20:11

标签: javascript duration date-range

最近我遇到了计算多个日期持续时间总量的问题,而我现在还没怎么做。假设您有5个日期范围,并且您想要计算持续时间的总量而不会将重叠范围添加两次或三次....你会怎么做?

1 个答案:

答案 0 :(得分:0)

在考虑了很多之后,我提出了一个简单的解决方案:将所有开始和结束日期添加到列表中并对列表中的日期进行排序。然后从左到右,并在列表中的每个日期之间添加所有子范围。假设你有一个带有这样的条目的排序日期列表:

dateList = [
   {
       date: "startDate",
       end: false,
       index: 1
   },
    {
       date: "endDate",
       end: true,
       index: 1
   },
   ....
]

用于计算持续时间(以月为单位)的示例代码将是这样的:它不是最好的代码,但也许这样更容易理解。任何改进都表示赞赏:

function calculateDurationAmountWithoutAddingOverlappingRanges(dateList) {
    var months = 0;
    var currentOverlappingList = [];

    for(var i = 0; i < dateList.length; i++) {

        var startExists = false;
        for(var j = 0; j < currentOverlappingList.length; j++) {
            if (!currentOverlappingList[j].end) {
                startExists = true;
            }
        }

        var amount = 0;
        if (startExists) {
            amount = monthDiff(dates[i-1].date, dates[i].date);
        }

        currentOverlappingList.push(dates[i]);

        // remove date from list if end date (means remove start and end)
        if (dates[i].end) {
            for(var k = 0; k < currentOverlappingList.length; k++) {
                if(currentOverlappingList[k].index == dates[i].index) {
                    currentOverlappingList.splice(k,1);
                }
            }
        }
        months += amount;
    }
    return months;
}