首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算总日期范围,是否有空格

计算总日期范围,是否有空格
EN

Stack Overflow用户
提问于 2020-01-09 17:35:15
回答 1查看 96关注 0票数 0

我正在尝试获取不同日期范围的总年份。这是我的代码:

代码语言:javascript
运行
复制
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

我知道我错过了许多条件和计算,我不确定我是否正确地处理了范围之间的年份。

任何帮助都将不胜感激!

EN

Stack Overflow用户

发布于 2020-01-09 20:15:04

你的逻辑看起来乱七八糟,有太多的东西要提供完整的分析,但这里有几个问题:

代码语言:javascript
运行
复制
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()解决这个问题,但这可能会产生其他后果。

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

代码语言:javascript
运行
复制
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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59660966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档