亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

繁花不似錦 2022-09-23 21:45:43
我有一系列的日期范圍,我需要知道全年每周有多少人工作。Eg: mainArray = ['01-01-2020','31-12-2020']; //year rangedateRanges = [  [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 周中的日期)在第 1 和第 2 個數組索引中重復,這就是為什么輸出將 2 作為第一個值的原因。由于第 2 周的日期在日期范圍[1]、日期范圍[2]、日期范圍[3]中重復,這就是為什么輸出中 3 作為第二個值的原因。由于沒有人在第3周工作,它在輸出數組中為0周開始 - 周日,每周7天,我希望周的日期范圍從1月1日開始,所以第一周將是部分周,因為第一周是星期三。這聽起來可能令人困惑。我已經盡力解釋。
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

我們需要一個函數來計算周的總計數:


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 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)


查看完整回答
反對 回復 2022-09-23
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

檢查這是否適合您。


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");

//}


查看完整回答
反對 回復 2022-09-23
  • 2 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號