Javascript 计算包含或不包含间隙的总日期范围

Javascript 计算包含或不包含间隙的总日期范围,javascript,node.js,loops,date,math,Javascript,Node.js,Loops,Date,Math,我试图获得不同日期范围的总年数。 这是我的代码: 函数计算(日期){ 设total=0; 让以前的开始听; 让过去的一年过去; dates.forEach(日期=>{ 让endYear=新日期(Date.EndingDate).getFullYear(); 让startYear=新日期(Date.StartDate).getFullYear(); 如果(previousStartYear&&endYear>previousStartYear){ 合计+=(年末-开始日期)-(年末-上一个开始日

我试图获得不同日期范围的总年数。 这是我的代码:

函数计算(日期){
设total=0;
让以前的开始听;
让过去的一年过去;
dates.forEach(日期=>{
让endYear=新日期(Date.EndingDate).getFullYear();
让startYear=新日期(Date.StartDate).getFullYear();
如果(previousStartYear&&endYear>previousStartYear){
合计+=(年末-开始日期)-(年末-上一个开始日期);
如果(previousEndYear&&endYear>previousEndYear){
合计+=(年末-上一个年末);
}
}否则{
合计+=年底-开始日期;
}
previousStartYear=startYear;
previousEndYear=年底;
})
返回总数;
}
//Eample 1
设x1=计算([{
起始日期:“2008-01-01T00:00:00.000Z”,
结束日期:“2016-01-01T00:00:00.000Z”,
},
{
起始日期:“2006-03-01T00:00:00.000Z”,
结束日期:“2008-01-01T00:00:00.000Z”,
},
{
起始日期:“2005-01-01T00:00:00.000Z”,
结束日期:“2015-11-01T00:00:00.000Z”,
},
{
起始日期:“2002-01-01T00:00:00.000Z”,
结束日期:“2010-01-01T00:00:00.000Z”,
},
{
起始日期:“2001-01-01T00:00:00.000Z”,
结束日期:“2008-11-01T00:00:00.000Z”,
}
])
log('示例1:'+x1);
让x2=计算([//2
{
起始日期:“2019-01-01T00:00:00.000Z”,
结束日期:“2020-01-01T00:00:00.000Z”,
},
{
起始日期:“2017-03-01T00:00:00.000Z”,
结束日期:“2018-01-01T00:00:00.000Z”,
},
{
起始日期:“2007-01-01T00:00:00.000Z”,
结束日期:“2019-11-01T00:00:00.000Z”,
}
]);

log('Example 2:'+x2)
您的逻辑似乎有点混乱,需要进行太多的分析,但这里有几个问题:

previousStartYear = startYear;
在我看来,只有当startYear小于prevoiusStartYear,或者prevoiusStartYear尚未初始化时,才应该分配该值。同样适用于
previousEndYear=endYear

此外,“2008-01-01T00:00:00.000Z”将被解析为UTC,因此对于时区偏移量为负的用户,
新日期('2008-01-01T00:00:00.000Z')。getFullYear()
将返回2007年,而该年中的任何其他日期将返回2008年。您可以使用
getUTCFullYear()
修复此问题,但这可能会产生其他后果

如果你只想得到从最早的开始年到最近的结束年的范围,那么只需要得到最早的开始年并从最近的结束年中减去它,例如

函数计算(数据){
设o={};
data.forEach(obj=>{
//不用担心日期,只要从字符串中获取年份即可
设start=obj.StartDate.substr(0,4);
设end=obj.EndingDate.substr(0,4);
//初始化o.start和o.end(如果尚未完成)
如果(!o.start){
o、 开始=开始;
o、 结束=结束;
//如果开始较早或结束较晚,则更新值
}否则{
如果(启动o.end)o.end=结束;
}
});
//有所不同
返回o.end-o.start;
}
设data1=[
{开始日期:'2008-01-01T00:00:00.000Z',
结束日期:“2016-01-01T00:00:00.000Z”,
{开始日期:'2006-03-01T00:00:00.000Z',
结束日期:“2008-01-01T00:00:00.000Z”,
{开始日期:'2005-01-01T00:00:00.000Z',
结束日期:“2015-11-01T00:00:00.000Z”,
{起始日期:'2002-01-01T00:00:00.000Z',
结束日期:'2010-01-01T00:00:00.000Z'},
{起始日期:'2001-01-01T00:00:00.000Z',
结束日期:'2008-11-01T00:00:00.000Z'}
];
console.log(计算(数据1));//15
让数据2=[
{起始日期:'2019-01-01T00:00:00.000Z',
结束日期:'2020-01-01T00:00:00.000Z'},
{起始日期:'2017-03-01T00:00:00.000Z',
结束日期:“2018-01-01T00:00:00.000Z”,
{开始日期:'2007-01-01T00:00:00.000Z',
结束日期:'2019-11-01T00:00:00.000Z'}
];

console.log(计算(数据2));//13
我不确定我是否正确理解了您的要求,但有一种方法可以做到这一点,那就是获取最低的起始日期年份,然后是最高的结束日期年份,然后是最高的结束日期-最低的开始日期。如果您只关心年份,那么就不用担心日期对象。这一年正好是
date.EndingDate.split(/\D/)[0]
。如果您的时区位于格林威治以西,那么“2019-01-01T00:00:00.000Z”将返回2018年的本地年份,这将影响其他部分不是1月1日的结果。@IWHKYB感谢您的回复。高起点-低起点将忽略间隙感谢您的帮助@RobG!我尝试将此添加到else块中以处理间隙:
if(endo.end)o.end=结束
然后将总间隙减去差值
返回(o.end-o.start)-间隙虽然它与问题的给定示例(有间隙的示例)配合得很好,但它将数据2的总数减去1,使之成为12。你能帮我指出我错过了什么吗?多谢各位