簡體   English   中英

如何從一系列日期范圍中找到一個人的工作經驗年限,工作日期可能重疊

[英]How to find the years of work experience of a person from an array of date ranges, with potentially overlapping work dates

目標是使用 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);

這是一種“蠻力”方法。

  • 提取所有獨特的年份
  • 對它們進行排序
  • 找出最新年份和最早年份之間的差異

(假設數據集中的所有年份都屬於一個字段;不同的字段不應屬於同一數據集)

例如:[2001, 2004, 2005, 2008, 2009, 2016, 2020, 2021] => 工作 20 年。

這種方法的一個警告是它無法計算months

相同的解決方案是 [不確定] 將月份轉換為一年(月/12)並將其添加到前一年(如 2001 年 2 月 => 2001.166)。

另一個需要注意的是,它沒有考慮到中間的任何中斷。 (正如評論中指出的那樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM