如何使用moment.js获取给定范围内每个月的特殊日期列表

时间:2019-01-07 11:22:56

标签: javascript date momentjs

我们假设开始日期为2019-01-10。我们必须提前15个月检查。 因此结束日期为2020-04-10

我想获得上面列表中每个月的每10天的列表。

喜欢以下内容:

  

['2019-01-10','2019-02-10','2019-03-10','2019-04-10',......,   '2020-04-10']

js,如何立即执行此操作? 如果在moment.js中无法做到这一点,那么我们可以使用JavaScript进行哪些操作?

3 个答案:

答案 0 :(得分:2)

在普通JavaScript中,只需使用Date.setMonth。对于开始日期(例如29、30和31),结果日期将延续到下个月,因此您必须处理这种情况。

function buildDates(startDate, months) {
  return Array.from({
    length: months
  }, function(_, i) {
    var date = new Date(startDate.getTime());
    var mnth = date.getMonth();
    date.setMonth(mnth + i);
    if (date.getMonth() !== (mnth + i) % 12) {
      date.setDate(0);
    }
    return date;
  });
}

console.log(buildDates(new Date(2019, 0, 10), 15));
console.log(buildDates(new Date(2019, 0, 31), 15));

答案 1 :(得分:1)

您可以通过add方法将日期移动n个月。像这样:

function dateOffsetByMonths(months, dateStr, format) {
  var startDate = moment(dateStr, format);
  return Array.from(Array(months + 1).keys()).reduce(function(res, n, i) {
    var date = startDate.clone();
    date.add(i, 'months');
    res.push(date.format('YYYY-MM-DD'));
    return res;
  }, []);
}

console.log(dateOffsetByMonths(15, '2019-01-10', 'YYYY-MM-DD'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

答案 2 :(得分:1)

您可以使用array#from来累积数组中的所有日期。在每次迭代中都将索引添加到初始日期。

function allDates(length, date, format) {
  return Array.from({length}, (_, i) => moment(date, format).add(i, 'months').format(format));
}

console.log(allDates(15, '2019-01-31', 'YYYY-MM-DD'));
console.log(allDates(15, '2019-01-10', 'YYYY-MM-DD'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>