Pregunta

Estoy tratando de hacer 2 cosas.

  1. 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)
  2. 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.

¿Fue útil?

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
scroll top