如何在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 周中的日期)在第 1 和第 2 个数组索引中重复,这就是为什么输出将 2 作为第一个值的原因。


由于第 2 周的日期在日期范围[1]、日期范围[2]、日期范围[3]中重复,这就是为什么输出中 3 作为第二个值的原因。


由于没有人在第3周工作,它在输出数组中为0


周开始 - 周日,每周7天,

我希望周的日期范围从1月1日开始,所以第一周将是部分周,因为第一周是星期三。


这听起来可能令人困惑。我已经尽力解释。


繁花不似锦
浏览 70回答 2
2回答

波斯汪

我们需要一个函数来计算周的总计数:function getISOWeeks(y) {&nbsp; &nbsp; var d,&nbsp; &nbsp; &nbsp; &nbsp; isLeap;&nbsp; &nbsp; d = new Date(y, 0, 1);&nbsp; &nbsp; isLeap = new Date(y, 1, 29).getMonth() === 1;&nbsp; &nbsp; //check for a Jan 1 that's a Thursday or a leap year that has a&nbsp; &nbsp; //Wednesday jan 1. Otherwise it's 52&nbsp; &nbsp; return d.getDay() === 4 || isLeap && d.getDay() === 3 ? 53 : 52}还有一个得到周数的函数:function getWeek(date_string) {&nbsp; &nbsp; let [d, M, y] = date_string.split(/[- :]/);&nbsp; &nbsp; let passedDate = new Date(y, parseInt(M) - 1, d);&nbsp; &nbsp; let onejan = new Date(passedDate.getFullYear(), 0, 1);&nbsp; &nbsp; week = Math.ceil( (((passedDate - onejan) / 86400000) + onejan.getDay() + 1) / 7 );&nbsp; &nbsp; return week;}&nbsp;在我们经历了这周之后,我们每周计算人数。然后我们可以计算出一整年中每周有多少人在工作。let weeks = dateRanges.map(s => s.map(d => this.getWeek(d)));let distinctWeeks = weeks.map(s =>&nbsp;&nbsp; &nbsp; s.filter((item, pos) => s.indexOf(item) == pos)).flatMap(s => s);let personPerWeek = distinctWeeks.reduce((a, c)=> {&nbsp; &nbsp; a[c] = a[c] || 0;&nbsp; &nbsp; a[c] += 1;&nbsp; &nbsp; return a;},{})const weekCount = getISOWeeks(2020);let personsPerWeeks = [];getWorkWeeks = (workWeeks, weekCount) => {&nbsp; &nbsp; for (let index = 1; index <= weekCount; index++) {&nbsp; &nbsp; &nbsp; &nbsp; let personCount = personPerWeek[index] || 0;&nbsp; &nbsp; &nbsp; &nbsp; workWeeks.push(personCount);&nbsp; &nbsp; }&nbsp; &nbsp; return workWeeks;}一个例子可以在这里看到:function getWeek(date_string) {&nbsp; &nbsp; let [d, M, y] = date_string.split(/[- :]/);&nbsp; &nbsp; let passedDate = new Date(y, parseInt(M) - 1, d);&nbsp; &nbsp; let onejan = new Date(passedDate.getFullYear(), 0, 1);&nbsp; &nbsp; week = Math.ceil( (((passedDate - onejan) / 86400000) + onejan.getDay() + 1) / 7 );&nbsp; &nbsp; return week;}function getISOWeeks(y) {&nbsp; &nbsp; var d,&nbsp; &nbsp; &nbsp; &nbsp; isLeap;&nbsp; &nbsp; d = new Date(y, 0, 1);&nbsp; &nbsp; isLeap = new Date(y, 1, 29).getMonth() === 1;&nbsp; &nbsp; //check for a Jan 1 that's a Thursday or a leap year that has a&nbsp; &nbsp; //Wednesday jan 1. Otherwise it's 52&nbsp; &nbsp; return d.getDay() === 4 || isLeap && d.getDay() === 3 ? 53 : 52}let dateRanges = [&nbsp; ['01-01-2020', '03-01-2020'], //week 1&nbsp; ['03-01-2020', '06-01-2020'], //week 1 and 2&nbsp; ['09-01-2020', '09-01-2020'], //week 2&nbsp; ['10-01-2020', '11-01-2020'], //week 2&nbsp; ['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)=> {&nbsp; &nbsp; a[c] = a[c] || 0;&nbsp; &nbsp; a[c] += 1;&nbsp; &nbsp; return a;},{})const weekCount = getISOWeeks(2020);let personsPerWeeks = [];getWorkWeeks = (workWeeks, weekCount) => {&nbsp; &nbsp; for (let index = 1; index <= weekCount; index++) {&nbsp; &nbsp; &nbsp; &nbsp; let personCount = personPerWeek[index] || 0;&nbsp; &nbsp; &nbsp; &nbsp; workWeeks.push(personCount);&nbsp; &nbsp; }&nbsp; &nbsp; return workWeeks;}getWorkWeeks(personsPerWeeks, weekCount);console.log(personsPerWeeks)

至尊宝的传说

检查这是否适合您。dateRanges = [&nbsp;["01-01-2020", "03-01-2020"], //week 1&nbsp; ["03-01-2020", "06-01-2020"], //week 1 and 2&nbsp; ["09-01-2020", "09-01-2020"], //week 2&nbsp; ["10-01-2020", "11-01-2020"], //week 2&nbsp; ["22-01-2020", "23-01-2020"], //week 4];mainArray = ['01-01-2020','31-12-2020'];//console.log(dateRanges);function diff_weeks(dt2, dt1)&nbsp;&nbsp;{&nbsp; var diff =(dt2.getTime() - dt1.getTime()) / 1000;&nbsp; diff /= (60 * 60 * 24 * 7);&nbsp; return Math.abs(Math.round(diff));&nbsp;&nbsp;&nbsp;}//for(var i = 0; i< dateRanges.length;i++){//console.log(dateRanges[i][0]);&nbsp; var dateString1 = mainArray[0];&nbsp; var dateParts1 = dateString1.split("-");&nbsp;&nbsp; var dt1 = new Date(+dateParts1[2], dateParts1[1] - 1, +dateParts1[0]);&nbsp;&nbsp; var dateString2 = mainArray[1];&nbsp; var dateParts2 = dateString2.split("-");&nbsp;&nbsp; var dt2 = new Date(+dateParts2[2], dateParts2[1] - 1, +dateParts2[0]);&nbsp;&nbsp; //console.log(dt1);&nbsp; console.log(diff_weeks(dt1, dt2) + " Weeks");//}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript