我需要用年值来计算工作经验的总和。用户在简历中添加开始日期和结束日期的体验,就像Linkedin一样。但没有任何特定的模式。例如;
用户可能有这样的简历;
体验2 08.2012 - 01.2015 经验1 01.2011 - 01.2013
用户开始了第二次体验,而第一次体验还没有完成。因此,简历可能有许多重叠的经验。重叠也可能发生在2以上,所以我需要考虑很多情况。
我试着想象你的经历和一年的关系。

我只需要为这个问题开发一个涵盖所有案例的算法。
发布于 2017-10-19 12:29:23
(Jan 2012, Jan 2015), (Jan 2014, Dec 2016)重叠,所以我们把它当作一个单一的体验(Jan 2012, Dec 2016)
这是假设经验可能存在差距,所以我们不想把整个历史当作一个长期的“超级体验”。
发布于 2018-01-10 22:45:54
我刚做了这个
正如你所看到的,每次我们设定新的终点时,如果体验的终点比我们的更大。
最后,我们得到了月份,如果你除以12,你得到的年数--如果你想的话--你可以把它整整。
注意:我映射了体验,如果没有结束,就意味着这相当于现在的
您可以看到下面的所有代码
function monthDiff(d1, d2) {
var m = (d1.getFullYear() - d2.getFullYear()) * 12 +
(d1.getMonth() - d2.getMonth());
if (d1.getDate() < d2.getDate()) --m;
return m;
}
function dateCheck(from, to, check) {
var fDate, lDate, cDate;
fDate = Date.parse(from);
lDate = Date.parse(to);
cDate = Date.parse(check);
if (cDate <= lDate && cDate >= fDate) {
return true;
}
return false;
}
function calculateYearsOfExperience(experiences) {
if (!experiences) return 0;
let months = 0;
let now = new Date();
let sorted = experiences
.sort((a, b) => {
return new Date(a.begin) - new Date(b.begin);
})
.map(experience => {
if (!experience.end) experience.end = now;
return { begin: experience.begin, end: experience.end };
});
let begin;
let end;
for (var i in sorted) {
let dif = 0;
if (!end && !begin) {
dif = monthDiff(sorted[i].begin, sorted[i].end);
begin = sorted[i].begin;
end = sorted[i].end;
} else if (
!dateCheck(begin, end, sorted[i].begin) &&
!dateCheck(begin, end, sorted[i].end)
) {
dif = monthDiff(sorted[i].begin, sorted[i].end);
end = sorted[i].end;
} else if (dateCheck(begin, end, sorted[i].begin)) {
dif = monthDiff(end, sorted[i].end);
end = sorted[i].end;
}
months += dif;
}
return months / 12;
}发布于 2017-10-19 12:29:35
创建一个包含0的数组。元素范围:开始将是第一个雇用日期,最后将是当前日期/最后一个工作日期。对于每年有12个元素可以是0/1。在填写数组后,计算值为1的元素。如果需要考虑重叠,那么忽略0/1部分,并给出每个月工作的+1。
https://stackoverflow.com/questions/46829768
复制相似问题