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