Calcular los días hábiles en el mes con JavaScript.
-
09-12-2019 - |
Pregunta
Estoy tratando de hacer 2 cosas.
- Calcule el número de días hábiles hasta la fecha en un mes determinado basado en el día actual (es decir, hoy es el 7 de marzo de 2012, por lo tanto, se han aprobado 5 días hábiles)
- Calcule el número de días hábiles para ir en un mes determinado basado en el día actual (es decir, hoy es el 7 de marzo de 2012, por lo tanto, hay 17 días hábiles que quedan este mes.
Cualquier ayuda aquí sería muy apreciada.
Editar: Esto es lo que he intentado hasta ahora:
function isWeekday(year, month, day) {var day = new Date(year, month, day).getDay();return day !=0 && day !=6;} function getWeekdaysInMonth(month, year) {var days = daysInMonth(month, year);var weekdays = 0;for(var i=0; i< days; i++) {if (isWeekday(year, month, i+1)) weekdays++;}return weekdays;} function calcBusinessDays(dDate1, dDate2) { var iWeeks, iDateDiff, iAdjust = 0; if (dDate2 < dDate1) return -1; // error code if dates transposed var iWeekday1 = dDate1.getDay(); // day of week var iWeekday2 = dDate2.getDay(); iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7 iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2; if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2; // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000) iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000) if (iWeekday1 <= iWeekday2) { iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1) } else { iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2) } iDateDiff -= iAdjust // take into account both days on weekend return (iDateDiff + 1); // add 1 because dates are inclusive }
No estoy seguro de cómo ponerlo todos juntos para pasar los días hábiles y los días hábiles para ir.
Solución
Aquí hay una función realmente simple que simplemente se bucea a lo largo de los días, debería ser lo suficientemente rápido como nunca debe tener que hacerlo más de 31 veces.Si el día actual es un día hábil, se cuenta en los días pasados:
function businessDays(date) {
// Copy date
var t = new Date(date);
// Remember the month number
var m = date.getMonth();
var d = date.getDate();
var daysPast = 0, daysToGo = 0;
var day;
// Count past days
while (t.getMonth() == m) {
day = t.getDay();
daysPast += (day == 0 || day == 6)? 0 : 1;
t.setDate(--d);
}
// Reset and count days to come
t = new Date(date);
t.setDate(t.getDate() + 1);
d = t.getDate();
while (t.getMonth() == m) {
day = t.getDay();
daysToGo += (day == 0 || day == 6)? 0 : 1;
t.setDate(++d);
}
return [daysPast, daysToGo];
}
alert(businessDays(new Date(2012,2,7))); // 7-Mar-2012 => 5, 17
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow