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]
]
谢谢!!!
在您推入主数组的子数组中,您忘记了计算月底的日期。
在这种情况下最好使用 start
和 end 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>
更新:
我想使用 startDate
和 endDate
分隔开始日期和结束日期,您可以在每个周期中添加一个控件。
在这个片段中,我使用了[三元运算符](条件(三元)运算符)进行检查(我不知道你是否看到了)。
我做的一件非常重要的事情是 .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>
我正在尝试 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]
]
谢谢!!!
在您推入主数组的子数组中,您忘记了计算月底的日期。
在这种情况下最好使用 start
和 end 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>
更新:
我想使用 startDate
和 endDate
分隔开始日期和结束日期,您可以在每个周期中添加一个控件。
在这个片段中,我使用了[三元运算符](条件(三元)运算符)进行检查(我不知道你是否看到了)。
我做的一件非常重要的事情是 .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>