2017-10-19 134 views
1

我需要將總工作經驗計算爲年度值。用戶將其開始和結束日期的經驗添加到他們的簡歷中,就像LinkedIn一樣。但沒有任何一定的模式。例如;計算總工作經驗

用戶可能有這樣的簡歷;

經驗2 08.2012 - 01.2015

經驗1 01.2011 - 01.2013

用戶開始他們的第二個經驗,同時第一個還沒有完成。所以簡歷可能會有許多重疊的經歷。重疊也可能發生在2個以上。所以我需要考慮很多情況。

我試圖爲您呈現體驗和年度關係。

enter image description here

我只需要開發一種算法涵蓋所有​​的情況下,針對此問題。

回答

2
  • 排序開始日期
  • 開始在開始和積累的經驗重疊(即當作一個)
    • 例如(Jan 2012, Jan 2015), (Jan 2014, Dec 2016)重疊,因此我們將其視爲單一體驗
    • 這種「超級體驗」開始於第一次開始,結束於最後; (Jan 2012, Dec 2016)

這是假設,有可能在經驗的差距,所以我們不希望把整個歷史,一個長的「超級體驗」

0

創建一個數組充滿了0。元素範圍:開始將是第一個僱傭日期,最後是當前日期/上一個工作日期。每年你有12個元素可以是0/1。填充數組後,計算具有值1的元素。如果需要考慮重疊,則忽略0/1部分,併爲每個工作月份給予+1。

0
experiences = [ 
     # (start date, end date), 
     (date(2012, 8, 1), date(2015, 1, 30)), 
     (date(2011, 1, 1), date(2013, 1, 30)) 
] 

print(sum((end_date - start_date).days/365 for start_date, end_date in experiences)) 
1

我只是做這個

  1. 排序經驗的開始日期。
  2. 使用2個變量,表示開始的工作和結束稱爲開始 和結束。
  3. 如果結束和開始是空的,這意味着這是第一次約會,我們充滿了第一次經歷,並且我們計算了這次經歷的開始和結束之間的月份數,然後這個月的數字加上了我們的月累加器。
  4. 如果下次經歷的結束日期和開始日期不在我們的開始和結束變量之間,我們會根據經驗計算月份數,然後將其添加到我們的累加器中。
  5. 如果下一次經歷的開始日期在我們的開始和結束變量之間,我們會計算從開始的結束日期到結束日期之間的月結算,然後該差異會加到我們的月份累加器中。

正如你可以看到每次我們設置新的結束,如果經驗的結局比我們的更大。

在我們得到的幾個月裏,如果除以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; 
} 
所有代碼