javascript 创建日期对数组的数组,这些日期对之间的间隔为n天

pu82cl6c  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(116)

考虑2个日期,格式为MM/DD/YYYY
第1天=今天第2天=从今天起45天
注:此处,第一个日期和第二个日期是可变的。即,今天的第一个日期可以是明天或任何其他日期。第二个日期可以是15天、24天、105天,即,此“n”也可以变化。
假设上述两个日期为startDate和stopDate。我想创建一个给定间隔的datePairs数组。
例如,如果startDate = 12/01/2022 & stopDate = 12/20/2022,我希望datePairs之间的间隔为2(n = 2)天。因此,输出数组应如下所示

[
    ['12/01/2022', '12/03/2022'],
    ['12/04/2022', '12/06/2022'],
    ['12/07/2022', '12/09/2022'],
    ['12/10/2022', '12/12/2022'],
    ['12/13/2022', '12/15/2022'],
    ['12/16/2022', '12/18/2022'],
    ['12/19/2022', '12/20/2022']
]

注意:这里,最后一个数组没有2个日期差距,因为它离stopDate只有1天。在这种情况下,最后一对之间的间隔可以更小。
唯一的条件是上面的数组长度应该总是偶数。

Date.prototype.addDays = function (days) {
    var dat = new Date(this.valueOf());
    dat.setDate(dat.getDate() + days);
    return dat;
};

function splitInto(array, size, inplace) {
    var output, i, group;
    if (inplace) {
        output = array;
        for (i = 0; i < array.length; i++) {
            group = array.splice(i, size);
            output.splice(i, 0, group);
        }
    } else {
        output = [];
        for (i = 0; i < array.length; i += size) {
            output.push(array.slice(i, size + i));
        }
    }
    return output;
}

function getDates(startDate, stopDate) {
    var dateArray = new Array();
    var currentDate = startDate;
    var i = 0;
    while (currentDate <= stopDate) {
        if (i % 2 == 1) {
            const options = {
                year: 'numeric'
            };
            options.month = options.day = '2-digit';
            var formattedCSTDate = new Intl.DateTimeFormat([], options).format(currentDate);
            dateArray.push(formattedCSTDate);
            currentDate = currentDate.addDays(1);
        } else {
            const options = {
                year: 'numeric'
            };
            options.month = options.day = '2-digit';
            var formattedCSTDate = new Intl.DateTimeFormat([], options).format(currentDate);
            dateArray.push(formattedCSTDate);
            currentDate = currentDate.addDays(3);
        }
        i = i + 1;
    }
    return dateArray;
};
var dateArray = getDates(new Date(), (new Date()).addDays(43));
var datePairLength = 2;
var rangeArray = splitInto(dateArray, datePairLength, false);
console.log(rangeArray);
ndh0cuux

ndh0cuux1#

在我看来,你把它弄得比实际需要的还要复杂。只要把每个范围构建成一个数组,避免使用 splitInto 函数。你可以使用一个日期库(有很多可供选择)来添加日期和设置格式:

function makeRanges(start = new Date(), end = new Date(), interval = 1) {
  let f = new Intl.DateTimeFormat('default', {
    year:'numeric',month:'short',day:'2-digit'
  });
  let s = new Date(start);
  let ranges = [];
  while (s < end) {
    let t = new Date(s);
    t.setDate(t.getDate() + interval);
    ranges.push([f.format(s), t < end? f.format(t) : f.format(end)]);
    s.setDate(s.getDate() + interval + 1)
  }
  return ranges;
}
console.log(
  makeRanges(new Date(2022,0,1), new Date(2022,1,1), 2)
);

相关问题