Tengo una matriz, en la que he insertado algún día que son festivos.
En mi aplicación, elijo un intervalo (startDate y endDate) y debo verificar que este intervalo no esté en mi matriz. ¿Como lo puedo hacer?
Por ejemplo:
holidaysArray = [ "2020-04-12", "2020-04-13", "*-03-17", "*-05-01", "*-06-02" }elijo como
startDate: 2022-03-15T16:16:00.000Z endDate:2022-03-18T16:12:23.103Z
lo que espero
Así que ahora debería contar el día entre startDate y EndDate, y el resultado es 4 días. Pero mi matriz tiene un valor "*-03-17", por lo que no debería considerar un día.
¿Como lo puedo hacer?
Tengo un selector de fecha:
<DatePicker modal open={showStartDate} date={startDate} title={null} confirmText="Ok" cancelText="Cancel" mode="date" onConfirm={(date) => { setShowStartDate(false) onChangeStart( date) }} onCancel={() => setShowStartDate(false)} /> <DatePicker modal open={showEndDate} date={endDate} title={null} confirmText="Ok" cancelText="Cancel" mode="date" onConfirm={(date) => { setShowEndDate(false) onChangeStart( date) }} onCancel={() => setShowEndDate(false)} />Así que mi
onChangeStart = (selectedDate) => { checkDate(selectedDate, endDate) } checkDate = (start, end) => { const holidayArray = travelInfo.time.holidayArray // }Cuando itera sobre 'holidayArray', debe verificar si el feriado se encuentra entre la fecha seleccionada, si solo disminuye la diferencia total entre las fechas en '1' (suponiendo que también cuente los domingos). En el caso de que las fechas tengan * , debe encontrar los 'años' que pueden estar entre las fechas y usarlos para reemplazar el * para formar la fecha adecuada.
Primer paso (Buscar año (o años si la selección es demasiado grande, por si acaso))
(suponiendo fecha de finalización > fecha de inicio)
const findYears = (startDate, endDate) => { let yearsArray = []; let endYear = parseInt(endDate?.split("-")[0]); let startYear= parseInt(startDate?.split("-")[0]); yearsArray.push(endYear); while(endYear !== startYear){ endYear--; yearsArray.push(endYear); } return yearsArray; } Ahora complete su función checkDate
checkDate = (start, end) => { const years = findYears(start, end) const holidayArray = travelInfo.time.holidayArray; var from = new Date(start); var to = new Date(end); var diff = 0; holidayArray.forEach(holiday => { if (holiday.match("\\*")) { years.forEach(year => { var check = new Date(holiday.replace("\\*", year)); if (check > from && check < to) { diff-- } }) } else { var check = new Date(holiday); if (check > from && check < to) { diff-- } } }) const diffTime = Math.abs(start - end); var diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24)); return diffDays + diff }