我正在尝试获取不同日期范围的总年份。这是我的代码:
function calculate(dates) {
let total = 0;
let previousStartYear;
let previousEndYear;
dates.forEach(date => {
let endYear = new Date(date.EndingDate).getFullYear();
let startYear = new Date(date.StartDate).getFullYear();
if (previousStartYear && endYear > previousStartYear) {
total += (endYear - startYear) - (endYear - previousStartYear);
if (previousEndYear && endYear > previousEndYear) {
total += (endYear - previousEndYear);
}
} else {
total += endYear - startYear;
}
previousStartYear = startYear;
previousEndYear = endYear;
})
return total;
}
// Eample 1
let x1 = calculate([{
StartDate: '2008-01-01T00:00:00.000Z',
EndingDate: '2016-01-01T00:00:00.000Z',
},
{
StartDate: '2006-03-01T00:00:00.000Z',
EndingDate: '2008-01-01T00:00:00.000Z',
},
{
StartDate: '2005-01-01T00:00:00.000Z',
EndingDate: '2015-11-01T00:00:00.000Z',
},
{
StartDate: '2002-01-01T00:00:00.000Z',
EndingDate: '2010-01-01T00:00:00.000Z',
}, ,
{
StartDate: '2001-01-01T00:00:00.000Z',
EndingDate: '2008-11-01T00:00:00.000Z',
}
])
console.log('Example 1: ' + x1);
let x2 = calculate([ //2
{
StartDate: '2019-01-01T00:00:00.000Z',
EndingDate: '2020-01-01T00:00:00.000Z',
},
{
StartDate: '2017-03-01T00:00:00.000Z',
EndingDate: '2018-01-01T00:00:00.000Z',
},
{
StartDate: '2007-01-01T00:00:00.000Z',
EndingDate: '2019-11-01T00:00:00.000Z',
}
]);
console.log('Example 2: ' + x2)
第一个示例返回22,而第二个示例返回正确的总数: 13
预期结果应该能够计算范围,即使有差距,例如:
2010 - 2011
2009 - 2011 -差距
2005 - 2007 -差距
2004 - 2008
我知道我错过了许多条件和计算,我不确定我是否正确地处理了范围之间的年份。
任何帮助都将不胜感激!
发布于 2020-01-09 20:15:04
你的逻辑看起来乱七八糟,有太多的东西要提供完整的分析,但这里有几个问题:
previousStartYear = startYear;在我看来,只有当startYear小于prevoiusStartYear,或者previousStartYear还没有初始化时,才应该赋值。previousEndYear = endYear也是如此。
此外,' 2008 -01-01T00:00:00.000Z‘将被解析为协调世界时,因此对于时区偏移量为负值的用户,new Date('2008-01-01T00:00:00.000Z').getFullYear()将返回2007,而一年中的任何其他日期都将返回2008。您可以使用getUTCFullYear()解决这个问题,但这可能会产生其他后果。
如果你只想得到从最早的开始年到最晚的结束年的范围,那么只需要得到最早的开始年并从最晚的结束年中减去它,例如
function calculate(data) {
let o = {};
data.forEach(obj => {
// Don't bother with Dates, just get the year from the string
let start = obj.StartDate.substr(0,4);
let end = obj.EndingDate.substr(0,4);
// Initialise o.start and o.end if not already done
if (!o.start) {
o.start = start;
o.end = end;
// Update values if start earlier or end later
} else {
if (start < o.start) o.start = start;
if (end > o.end) o.end = end;
}
});
// Get difference
return o.end - o.start;
}
let data1 = [
{StartDate: '2008-01-01T00:00:00.000Z',
EndingDate: '2016-01-01T00:00:00.000Z'},
{StartDate: '2006-03-01T00:00:00.000Z',
EndingDate: '2008-01-01T00:00:00.000Z'},
{StartDate: '2005-01-01T00:00:00.000Z',
EndingDate: '2015-11-01T00:00:00.000Z'},
{StartDate: '2002-01-01T00:00:00.000Z',
EndingDate: '2010-01-01T00:00:00.000Z'},
{StartDate: '2001-01-01T00:00:00.000Z',
EndingDate: '2008-11-01T00:00:00.000Z'}
];
console.log(calculate(data1)); // 15
let data2 = [
{StartDate: '2019-01-01T00:00:00.000Z',
EndingDate: '2020-01-01T00:00:00.000Z'},
{StartDate: '2017-03-01T00:00:00.000Z',
EndingDate: '2018-01-01T00:00:00.000Z'},
{StartDate: '2007-01-01T00:00:00.000Z',
EndingDate: '2019-11-01T00:00:00.000Z'}
];
console.log(calculate(data2)); // 13
https://stackoverflow.com/questions/59660966
复制相似问题