【问题标题】:How to get repeating week dates count between a date range in JavaScript?如何在 JavaScript 中的日期范围之间获取重复的周日期计数?
【发布时间】:2020-06-09 10:53:55
【问题描述】:

我有一组日期范围,我需要从中了解全年每周有多少人工作。

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

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

因为没有人在第 3 周工作,所以它在输出数组中为 0

每周开始 - 周日, 每周 7 天,
我希望周日期范围从 1 月 1 日开始,因此第一周将是部分周,因为第一个开始是星期三。

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

【问题讨论】:

  • @T.J.Crowder 很抱歉造成混乱。我已经编辑了这个问题。如果您需要任何进一步的说明,请告诉我。谢谢
  • w3resource.com/javascript-exercises/… 看到这个可以帮助你

标签: javascript arrays date


【解决方案1】:

我们需要a function which results overall count of 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
}

还有一个获取周数的函数:

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)

【讨论】:

  • 天才@StepUp 。该死!这是复杂的。非常感谢你?。我希望你在解决这个问题时玩得开心。 ?
  • @AshikPaul 谢谢你这么客气的话!我很高兴它对你有所帮助!祝你有美好的一天!
【解决方案2】:

检查这是否适合您。

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

【讨论】:

  • 会的,感谢您的即时回复。我无权投票赞成您的答案。我会检查并告诉你。非常感谢。 ?
  • 欢迎。一旦您获得足够的声誉,请投票。谢谢。如果这对你有用,也接受。 @AshikPaul
  • 我期待一个长度为 52(一年中的周数)的数组作为输出。请检查示例输出。
  • 我为mainArray 添加的代码与使用 for lop 对其他数组执行的操作相同。你也想要那个?
  • 我猜你还没有理解这个问题。你的输出是给我两个日期之间的周数。但我希望日期在所有周范围内重复(dateRanges 数组)。我将在示例中添加更多细节。很抱歉造成混乱。
猜你喜欢
  • 2021-12-31
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2011-03-22
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多