如何从一系列可能有重叠工作日期的日期范围中找到一个人的工作经验年限



目标是使用Javascript从一个人的工作历史的日期范围数组中唯一计算出一个人的总工作经验年数。有重叠的日期范围(也就是说,一个人在重叠期内有多份工作(。下面是一个示例,日期格式为yyyy-mm-dd;

  • 2001-02-01至2009-03-01
  • 2004-06-01至2020-08-01
  • 2005-04-01至2021-03-01
  • 2008-07-01至2016-06-01

从上述日期范围来看,存在重叠的工作日期。对一个人工作经验年数的正确计算应该是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);

这里有一个"Brute Force";方法

  • 提取所有独特的年份
  • 对它们进行排序
  • 找出最近年份和最老年份之间的差异

(假设数据集中的所有年份都属于一个字段;不同的字段不应该是同一数据集的一部分(

例如:[2001200420005200820092016202021]=>工作了20年。

此方法的一个警告是它无法说明months

对此的解决方案是[不确定]将月份转换为一年(月/12(,并将其添加到前一年(如2001年2月=>2001.166(。

另一个警告是它没有考虑到其间的任何中断。(如评论中所指出的(。

最新更新