[英]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.