计算没有重叠的日期范围的持续时间
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;
}
最近我在计算多个日期持续时间的总量时遇到了问题,但我现在不知道该怎么做。假设您有 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;
}