Estoy tratando de crear un método para calcular el total de días libres.
Tengo una matriz que contiene los días hábiles:
"díaslaborables": [1,2,3,4,5],
Así que tengo dos fechas; una fecha de startDate y una fecha de endDate , y debo contar en este rango cuántos días no son días laborables (es decir, el total de días libres).
Por ejemplo, tengo un rango del 15/03 (hoy) al 21/03, un total de 7 días.
Hoy (15/03) es el día 2, y es un día laborable por lo que no tengo que incrementar un contador de días libres, mientras que por ejemplo el 19/03 no es un día laborable (es el número 6) entonces tengo para incrementar la variable de día libre.
He intentado implementar el código, pero no funciona correctamente:
const checkDate = (start, end) => { const workingDays = [1,2,3,4,5] let dayOff = 0 var currentDate = new Date(start) while (currentDate <= end) { workingDays.map((day) => { console.log('current ', currentDate.getDay(), ' day ', day) if (currentDate.getDay() !== day) { dayOff += 1 } currentDate = currentDate.addDays(1) }) } console.log('dayOff ', dayOff) return dayOff }me imprime:
LOG current 2 day 1 LOG current 3 day 2 LOG current 4 day 3 LOG current 5 day 4 LOG current 6 day 5 LOG current 0 day 1 LOG current 1 day 2 LOG current 2 day 3 LOG current 3 day 4 LOG current 4 day 5 LOG dayOff 10pero está mal porque el resultado debería ser 2.
¿Como lo puedo hacer? Gracias
EDITAR.
La función que uso para agregar un día:
Date.prototype.addDays = function (days) { var date = new Date(this.valueOf()) date.setDate(date.getDate() + days) return date }currentDate = currentDate.addDays(1) .addDays no es una función correcta de Javascript. Se usa en C#.
A continuación se muestra el código correcto que devolverá la respuesta correcta:
const workingDays = [1,2,3,4,5] const endDate = new Date(startDate) let dayOff = [] var currentDate = new Date(endDate) while (currentDate <= endDate) { console.log('currentDate', currentDate) let index = workingDays.indexOf(currentDate.getDay()); console.log('dayOff - index', index) if(index == -1) { console.log('dayOffDate - addded', currentDate) dayOff.push(currentDate) } currentDate = new Date(currentDate.setDate(currentDate.getDate() + 1)) }La siguiente pequeña función calculará el total de días libres entre dos (2) fechas, dada la primera fecha y la fecha de finalización.
Es simple y asume que la fecha de finalización es la misma o posterior a la fecha de inicio (no comprueba si se revierten las fechas).
function getTotalOffDays(start,end) { const workingDays = [1,2,3,4,5]; let daysOff = 0, // days off counter date = new Date(start), // starting date endDate = new Date(end); // end date while (date <= endDate) { if (!workingDays.includes(date.getUTCDay())) daysOff += 1; // increment days off date = new Date(date.setUTCDate(date.getUTCDate() + 1)); // go the next day } return daysOff; } console.log("Total days off: " + getTotalOffDays("2022-03-15", "2022-03-21"));