从node.js中用户选择的日期范围中排除不在特定范围内的日期?

问题描述 投票:0回答:1

我有一个包含多个开始和结束日期范围以及用户选择的开始和结束日期范围的数组。我需要从用户选择的范围中排除指定日期范围内不存在的日期。

日期范围数组:-

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 范围内的日期?

javascript node.js express date date-range
1个回答
0
投票

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>

© www.soinside.com 2019 - 2024. All rights reserved.