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

Calculate duration for date ranges without overlaps

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

经过深思熟虑,我想到了一个简单的解决方案:将所有开始日期和结束日期添加到一个列表中,然后对列表中的日期进行排序。然后从左到右添加列表中每个日期之间的所有子范围。假设您有一个已排序的日期列表,其中包含如下条目:

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