javascript - 如何从一系列日期范围(可能有重叠的工作日期)中查找某人的工作经验年数

标签 javascript arrays date-range

我们的目标是使用 Javascript 从一个人的工作历史的日期范围数组中唯一地计算出一个人的工作经验的总年数。日期范围有重叠(这意味着该人在重叠期间有多个工作)。下面是一个示例,日期格式为 yyyy-mm-dd;

  • 2001-02-01 至 2009-03-01
  • 2004年6月1日至2020年8月1日
  • 2005年4月1日至2021年3月1日
  • 2008年7月1日至2016年6月1日

从上面的日期范围来看,存在重叠的工作日期。 正确计算该人的工作年限应为20年。

我遇到的问题是创建一个算法,可以考虑该人的四个工作历史中的重叠时期,而不是将它们算作单独的工作经验年数,例如,只是总结四个工作日期之间的年份给出 48 年,这是不正确的(经验超过 20 年)。

var time_diff=0, yrs_diff=0;

var jobExperience = [
  {date_began:'2001-02-01', date_ended:'2009-03-01'},
  {date_began:'2004-06-01', date_ended:'2020-08-01'},
  {date_began:'2005-04-01', date_ended:'2021-03-01'},
  {date_began:'2008-07-01', date_ended:'2016-06-01'}
];
for(let i=0; i<jobExperience.length; i++){
  let date_1, date_2;
  let began = jobExperience[i].date_began.split('-');
  let ended = jobExperience[i].date_ended.split('-');
  date_1 = new Date(began[1]+'/'+began[2]+'/'+began[0]);
  date_2 = new Date(ended[1]+'/'+ended[2]+'/'+ended[0]);
  time_diff += date_2.getTime() - date_1.getTime();
}
yrs_diff = parseInt(time_diff/(1000 * 3600 * 24 * 365));
console.log(yrs_diff);

上面的代码片段只是盲目地添加了每条工作历史记录之间的年份(这是不正确的)。我需要一些帮助的地方是一条线索,或者更好的是伪代码或完整代码,说明如何总结每个工作历史记录之间的年份,但考虑到工作历史日期之间的重叠,这样一来,重叠时期仅计算一次。

最佳答案

这是我在评论中概述的方法:

对于每个期间,将开始日期和结束日期转换为唯一的“月份值”,然后将一个期间的所有月份值添加到一个集合中。
集合的大小是所需的月数:

const jobExperience = [
  { date_began: '2001-02-01', date_ended: '2009-03-01' },
  { date_began: '2004-06-01', date_ended: '2020-08-01' },
  { date_began: '2005-04-01', date_ended: '2021-03-01' },
  { date_began: '2008-07-01', date_ended: '2016-06-01' }
];

const months = new Set();

// convert date into unique integer month value based on year 1900
function m1900(yyyymmdd) {
  const [_, y, m, d] = yyyymmdd.match(/^(\d{4})-(\d{2})-(\d{2})$/).map(Number);
  return (y - 1900) * 12 + m;
}

jobExperience.forEach(job => {
  const m1 = m1900(job.date_began);
  const m2 = m1900(job.date_ended);
  for (let m = m1; m < m2; m++) months.add(m);
});
console.log("years:", months.size / 12);

关于javascript - 如何从一系列日期范围(可能有重叠的工作日期)中查找某人的工作经验年数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67329612/

相关文章:

mysql - SQL 连接日期范围

excel - 查找并发、重叠、日期范围的数量

javascript - React useEffect 中的间隔 - 将其存储在 useRef Hook 中以保留值超时警告

javascript - 我如何制作 Gridview 或 Listview

c - malloc 与数组,无法理解为什么这有效

c++ - 如何找出标识符的名称是否为数组?

sql - 属于(日期)范围类型及其交集的权重总和

php - 如何防止用户以任何可能的方式获得一些显示的文本?

javascript weakmap 保留对已删除对象的引用

java - 是否可以从数组中删除项目?