我有一个包含多个开始和结束日期范围以及用户选择的开始和结束日期范围的数组。我需要从用户选择的范围中排除指定日期范围内不存在的日期。
日期范围数组:-
const venueTimings = [
{
start_date: '2024-07-01T00:00:00.000Z',
end_date: '2024-07-31T00:00:00.000Z'
},
{
start_date: '2024-08-01T00:00:00.000Z',
end_date: '2024-08-31T00:00:00.000Z'
},
{
start_date: '2024-10-01T00:00:00.000Z',
end_date: '2024-10-31T00:00:00.000Z'
}
];
用户选择的日期:-
const start_date = '2024-07-01T00:00:00.000Z';
const end_date = '2024-10-31T00:00:00.000Z';
我想排除 start_date 到 end_date 范围内不属于venueTimings 中任何范围的日期。
当前尝试:-
我尝试了以下代码,但没有完全达到预期的结果:-
if (moment(start_date) < moment(venueTiming.start_date)) {
for (let d = moment(start_date); d.diff(venueTiming.start_date, 'days') <= 0; d.add(1, 'days')) {
let date = d.format('YYYY-MM-DD');
excluded_dates.push({ date, reason: 'missing-venue-time' });
blocked_dates.push(date);
}
}
if (moment(venueTiming.end_date) < moment(end_date)) {
for (let d = moment(venueTiming.end_date); d.isBefore(moment(end_date)); d.add(1, 'days')) {
const date = d.format('YYYY-MM-DD');
if (d.format('dddd') === day) {
excluded_dates.push({ date, reason: 'missing-venue-time' });
blocked_dates.push(date);
}
}
}
问题:-
上面的代码没有准确排除在venueTimings范围之外的日期。如何正确排除用户选择的范围(start_date 到 end_date)中不在venueTimings 范围内的日期?
const venueTimings = [{
start_date: '2024-07-01T00:00:00.000Z',
end_date: '2024-07-31T00:00:00.000Z'
},
{
start_date: '2024-08-01T00:00:00.000Z',
end_date: '2024-08-31T00:00:00.000Z'
},
{
start_date: '2024-10-01T00:00:00.000Z',
end_date: '2024-10-31T00:00:00.000Z'
}
];
const start_date = '2024-07-01T00:00:00.000Z';
const end_date = '2024-10-31T00:00:00.000Z';
const userStartDate = moment(start_date); // Convert user provided dates to moment recognizable format
const userEndDate = moment(end_date); // Convert user provided dates to moment recognizable format
function rangesOverlap(range1Start, range1End, range2Start, range2End) {
return range1Start <= range2End && range1End >= range2Start; // Check if dates overlap on each other
}
let excludedDates = []; // All Excluded dates will be added excludedDates
venueTimings.forEach(venueTiming => {
const venueStart = moment(venueTiming.start_date);
const venueEnd = moment(venueTiming.end_date);
if (rangesOverlap(userStartDate, userEndDate, venueStart, venueEnd)) {
for (let d = moment.max(userStartDate, venueStart); d <= moment.min(userEndDate, venueEnd); d.add(1, 'day')) {
excludedDates.push(d.format('YYYY-MM-DD'));
}
}
});
console.log('Excluded Dates:', JSON.stringify(excludedDates));
<html lang="en">
<head>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
</body>
</html>