首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算总工作经验

计算总工作经验
EN

Stack Overflow用户
提问于 2017-10-19 12:22:41
回答 6查看 1.1K关注 0票数 1

我需要用年值来计算工作经验的总和。用户在简历中添加开始日期和结束日期的体验,就像Linkedin一样。但没有任何特定的模式。例如;

用户可能有这样的简历;

体验2 08.2012 - 01.2015 经验1 01.2011 - 01.2013

用户开始了第二次体验,而第一次体验还没有完成。因此,简历可能有许多重叠的经验。重叠也可能发生在2以上,所以我需要考虑很多情况。

我试着想象你的经历和一年的关系。

我只需要为这个问题开发一个涵盖所有案例的算法。

EN

回答 6

Stack Overflow用户

发布于 2017-10-19 12:29:23

  • 按开始日期排序
  • 从一开始就开始,积累重叠的经验(即作为一个整体对待)
    • 例如(Jan 2012, Jan 2015), (Jan 2014, Dec 2016)重叠,所以我们把它当作一个单一的体验
    • 这种“超级体验”从第一次开始,到最后一次结束;(Jan 2012, Dec 2016)

这是假设经验可能存在差距,所以我们不想把整个历史当作一个长期的“超级体验”。

票数 2
EN

Stack Overflow用户

发布于 2018-01-10 22:45:54

我刚做了这个

  1. 按开始日期对经历进行排序。
  2. 使用两个变量,它们表示 Begin of work和 End Begin and End。
  3. 如果结束和开始是空的,这意味着这是第一个日期,我们填充了第一个经验,我们计算这个经验的开始和结束之间的月份计数,然后这个月计数添加到我们的月份累加器。
  4. 如果下一次体验的结束日期和开始日期不是在我们的开始变量和结束变量之间,我们从经验中计算月计数,然后将它添加到累加器中。
  5. 如果下一次体验的开始日期在我们的开始变量和结束变量之间,我们计算结束日期之间的月计数作为开始,经验结束日期作为结束,然后这个差异添加到我们的月份累加器中。

正如你所看到的,每次我们设定新的终点时,如果体验的终点比我们的更大。

最后,我们得到了月份,如果你除以12,你得到的年数--如果你想的话--你可以把它整整。

注意:我映射了体验,如果没有结束,就意味着这相当于现在的

您可以看到下面的所有代码

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2017-10-19 12:29:35

创建一个包含0的数组。元素范围:开始将是第一个雇用日期,最后将是当前日期/最后一个工作日期。对于每年有12个元素可以是0/1。在填写数组后,计算值为1的元素。如果需要考虑重叠,那么忽略0/1部分,并给出每个月工作的+1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46829768

复制
相关文章

相似问题

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