簡體   English   中英

如何在 JavaScript 的日期范圍之間獲得重復的星期日期計數?

[英]How to get repeating week dates count between a date range in JavaScript?

我有一系列日期范圍,我需要從中了解全年每周有多少人工作。

Eg: mainArray = ['01-01-2020','31-12-2020']; //year range

dateRanges = [
  [01-01-2020, 03-01-2020], //week 1
  [03-01-2020, 06-01-2020], //week 1 and 2
  [09-01-2020, 09-01-2020], //week 2
  [10-01-2020, 11-01-2020], //week 2
  [22-01-2020, 23-01-2020], //week 4
  ....
];

//first we need to find all the weeks from the mainArray date-range 

//then calculate the weeks colliding in the dateRanges array.

the output should be =>

workLoadInWeeks = [2,3,0,1,0,0,0,0,......,0];

說明:由於 03-01-2020(第 1 周的日期)在第一個和第二個數組索引中重復,這就是為什么 output 將 2 作為第一個值。

由於第 2 周的日期在 dateRanges[1]、dateRanges[2]、dateRanges[3] 中重復,這就是 output 將 3 作為第二個值的原因。

由於沒有人在第 3 周工作,因此 output 陣列中的 0

一周開始 - 周日,每周 7 天,
我希望周日期范圍從 1 月 1 日開始,因此第一周將是部分周,因為第一個開始是星期三。

這聽起來可能令人困惑。 我已經盡力解釋了。

我們需要一個 function 來計算周數

function getISOWeeks(y) {
    var d,
        isLeap;

    d = new Date(y, 0, 1);
    isLeap = new Date(y, 1, 29).getMonth() === 1;

    //check for a Jan 1 that's a Thursday or a leap year that has a
    //Wednesday jan 1. Otherwise it's 52
    return d.getDay() === 4 || isLeap && d.getDay() === 3 ? 53 : 52
}

還有一個 function 獲得周數:

function getWeek(date_string) {
    let [d, M, y] = date_string.split(/[- :]/);
    let passedDate = new Date(y, parseInt(M) - 1, d);
    let onejan = new Date(passedDate.getFullYear(), 0, 1);
    week = Math.ceil( (((passedDate - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
    return week;
} 

在我們度過這幾周之后,我們每周計算人數。 然后我們可以計算出全年每周有多少人工作。

let weeks = dateRanges.map(s => s.map(d => this.getWeek(d)));

let distinctWeeks = weeks.map(s => 
    s.filter((item, pos) => s.indexOf(item) == pos)).flatMap(s => s);

let personPerWeek = distinctWeeks.reduce((a, c)=> {
    a[c] = a[c] || 0;
    a[c] += 1;
    return a;
},{})

const weekCount = getISOWeeks(2020);
let personsPerWeeks = [];

getWorkWeeks = (workWeeks, weekCount) => {
    for (let index = 1; index <= weekCount; index++) {
        let personCount = personPerWeek[index] || 0;
        workWeeks.push(personCount);
    }
    return workWeeks;
}

可以在這里看到一個例子:

 function getWeek(date_string) { let [d, M, y] = date_string.split(/[-:]/); let passedDate = new Date(y, parseInt(M) - 1, d); let onejan = new Date(passedDate.getFullYear(), 0, 1); week = Math.ceil( (((passedDate - onejan) / 86400000) + onejan.getDay() + 1) / 7 ); return week; } function getISOWeeks(y) { var d, isLeap; d = new Date(y, 0, 1); isLeap = new Date(y, 1, 29).getMonth() === 1; //check for a Jan 1 that's a Thursday or a leap year that has a //Wednesday jan 1. Otherwise it's 52 return d.getDay() === 4 || isLeap && d.getDay() === 3? 53: 52 } let dateRanges = [ ['01-01-2020', '03-01-2020'], //week 1 ['03-01-2020', '06-01-2020'], //week 1 and 2 ['09-01-2020', '09-01-2020'], //week 2 ['10-01-2020', '11-01-2020'], //week 2 ['22-01-2020', '23-01-2020'], //week 4 ]; let weeks = dateRanges.map(s => s.map(d => this.getWeek(d))); let distinctWeeks = weeks.map(s => s.filter((item, pos) => s.indexOf(item) == pos)).flatMap(s => s); let personPerWeek = distinctWeeks.reduce((a, c)=> { a[c] = a[c] || 0; a[c] += 1; return a; },{}) const weekCount = getISOWeeks(2020); let personsPerWeeks = []; getWorkWeeks = (workWeeks, weekCount) => { for (let index = 1; index <= weekCount; index++) { let personCount = personPerWeek[index] || 0; workWeeks.push(personCount); } return workWeeks; } getWorkWeeks(personsPerWeeks, weekCount); console.log(personsPerWeeks)

檢查這是否適合您。

 dateRanges = [ ["01-01-2020", "03-01-2020"], //week 1 ["03-01-2020", "06-01-2020"], //week 1 and 2 ["09-01-2020", "09-01-2020"], //week 2 ["10-01-2020", "11-01-2020"], //week 2 ["22-01-2020", "23-01-2020"], //week 4 ]; mainArray = ['01-01-2020','31-12-2020']; //console.log(dateRanges); function diff_weeks(dt2, dt1) { var diff =(dt2.getTime() - dt1.getTime()) / 1000; diff /= (60 * 60 * 24 * 7); return Math.abs(Math.round(diff)); } //for(var i = 0; i< dateRanges.length;i++){ //console.log(dateRanges[i][0]); var dateString1 = mainArray[0]; var dateParts1 = dateString1.split("-"); var dt1 = new Date(+dateParts1[2], dateParts1[1] - 1, +dateParts1[0]); var dateString2 = mainArray[1]; var dateParts2 = dateString2.split("-"); var dt2 = new Date(+dateParts2[2], dateParts2[1] - 1, +dateParts2[0]); //console.log(dt1); console.log(diff_weeks(dt1, dt2) + " Weeks"); //}

暫無
暫無

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

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