moment.js: Return 区间内每个月的第一天和最后一天

moment.js: Return the first and last day of each month within an interval

我正在尝试 return 一个数组,它会给我每个月的第一天和最后一天,同时考虑间隔的第一个月和最后一个月的开始日期和结束日期。

我似乎无法理解它。我只能做单独的位:'(

有哪位好心人可以帮助我理解吗?

var startDate = moment('2021-08-23');
var endDate = moment('2022-03-22');

var months = [];

if (endDate.isBefore(startDate)) {
    throw "End date must be greater than start date."
}      

while (startDate.isBefore(endDate)) {
    months.push(startDate.format("YYYY-MM-01"));
    startDate.add(1, 'month');
}

console.log(months);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

在这里,我得到

2021-08-01,
2021-09-01,
2021-10-01,
2021-11-01,
2021-12-01,
2022-01-01,
2022-02-01

当我真正想要得到

[
[2021-08-23, 2021-08-31],
[2021-09-01, 2021-09-30],
[2021-10-01, 2021-10-31],
[2021-11-01, 2021-11-30],
[2021-12-01, 2021-12-31],
[2022-01-01, 2022-01-31],
[2022-02-01, 2022-02-29],
[2022-03-01, 2022-03-31]
]

谢谢!!!

在您推入主数组的子数组中,您忘记了计算月底的日期。 在这种情况下最好使用 startend Of,而不必疯狂地计算正确的月中天数

const startDate = moment('2021-08-23');
const endDate = moment('2022-03-22');

const months = [];

if (endDate.isBefore(startDate)) {
  throw Error('End date must be greater than start date.');
}

while (startDate.isBefore(endDate)) {
  months.push([
    startDate.startOf('month').format('YYYY-MM-DD'),
    startDate.endOf('month').format('YYYY-MM-DD')
  ]);
  startDate.add(1, 'month');
}

console.log(months);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

更新: 我想使用 startDateendDate 分隔开始日期和结束日期,您可以在每个周期中添加一个控件。

在这个片段中,我使用了[三元运算符](条件(三元)运算符)进行检查(我不知道你是否看到了)。

我做的一件非常重要的事情是 .clone() 的时间来编辑 .endOf().startOf().

等操作

const startDate = moment('2021-08-23');
const endDate = moment('2022-03-22');

const months = [];

if (endDate.isBefore(startDate)) {
  throw Error('End date must be greater than start date.');
}

const cursor = startDate.clone();

while (cursor.isSameOrBefore(endDate, 'month')) {
  const firstDay = cursor.startOf('month').isBefore(startDate) ? startDate : cursor.clone().startOf('month');
  const lastDay = cursor.endOf('month').isAfter(endDate) ? endDate : cursor.clone().endOf('month');

  months.push([firstDay.format('YYYY-MM-DD'), lastDay.format('YYYY-MM-DD')]);

  cursor.add(1, 'month');
}

console.log(months);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>