MomentJS-获取日期范围,给出一个月中的特定日期



给定5月份的哪一天,如何最好地获得上个月/本月的5号到下个月的5日之间的日期范围?

// given today is May 24 2021
// should return May 5 - June 5
function getDateRange(selectedDay) {
const today = moment()
let previous, next
if (today.date() >= selectedDay) {
previous = today.clone().set('date', selectedDay)
next = today.clone().add(1, 'months').set('date', selectedDay)
}
else {
previous = today.clone().subtract(1, 'months').set('date', selectedDay)
next = today.clone().set('date', selectedDay)
}
return [ previous, next ]
}

这在大多数情况下都有效,除非选择的日期不存在(即31日(。

例如,如果今天的日期是Feb 15, 2021,而selectedDay31,那么函数应该返回Jan 31 - Feb 28

有人对此有一个优雅的解决方案吗?

我编辑了一些代码,并插入了一个函数来确定一个月的最长日期。

// To force a date I inserted a initDate like parameters, remove it if it's unnecessary
function getDateRange(selectedDay, initDate) {
const today = moment(initDate);
let previous;
let next;
if (today.date() >= selectedDay) {
previous = moment(today).startOf('month');
next = moment(today).add(1, 'month').startOf('month');
} else {
previous = moment(today).subtract(1, 'months');
next = moment(today);
}
previous = limiter(previous, selectedDay); // this function get the max date of the month
next = limiter(next, selectedDay);
return [previous, next];
}
function limiter(dateToLimit, selectedDay) {
if (moment(dateToLimit).endOf('month').isBefore(moment(dateToLimit).date(selectedDay))) dateToLimit = moment(dateToLimit).endOf('month');
else dateToLimit = moment(dateToLimit).date(selectedDay);
return dateToLimit;
}
console.log(getDateRange(31, '2021-02-15'));
console.log(getDateRange(31, '2021-03-15'));
console.log(getDateRange(13, '2021-02-15'));
console.log(getDateRange(13, '2021-09-15'));
console.log(getDateRange(26, '2021-09-15'));
console.log(getDateRange(26, '2021-09-27'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.1/moment.min.js"></script>

最新更新