Dias domingos y feriados entre dos fechas JAVASCRIPT

Qué tal, un nuevo snippet del problema que se me presentó en el trabajo, aunque ya lo había hecho pero para mysql, la lógica es mas o menos la misma.

El reto era calcular una fecha hábil apartir de una fecha de inicio más N número de días hábiles (no domingos, no días festivos).

Antes que nada recordemos que
 
weekday[0] =  "Sunday";

weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

La solución en javascript fue la siguiente


USO:
// calculaFechaTermino('fecha de inicio',dias a sumar)
  calculaFechaTermino('2017-12-02',2)  // nos regresa el dato 2017-12-05 en el formato yyyy-mm-dd

    <script>
        function calculaFechaTermino(fechatmp,diastmp){
            var date = new Date(fechatmp);
            var dateTermino = date.addWorkingDays(diastmp);
            var dd = dateTermino.getDate();
            var mm = dateTermino.getMonth()+1; //January is 0!
            var yyyy = dateTermino.getFullYear();
                if(dd<10){
                    dd='0'+dd;
                }
                if(mm<10){
                    mm='0'+mm;
                }
            var dateTermino = yyyy+'-'+mm+'-'+dd;
            return dateTermino;
        }

        Date.prototype.holidays = {
          // llenar con días festivos de acuerdo a tu país
          all: [
            '0101', // Jun 01
            '1225' // Dic 25
          ],
          2016: [
            // agregar año especifico
            '0104' // Jun 04 2016
          ],
          2017: [
            // requisitar de acuerdo a tus necesidades
          ]
        };

        Date.prototype.addWorkingDays = function(days) {
          while (days > 0) {
            this.setDate(this.getDate() + 1);
            if (!this.isHoliday()) days--;
          }

          return this;
        };

        Date.prototype.substractWorkingDays = function(days) {
          while (days > 0) {
            this.setDate(this.getDate() - 1);
            if (!this.isHoliday()) days--;
          }

          return this;
        };

        Date.prototype.isHoliday = function() {
          function zeroPad(n) {
            n |= 0;
            return (n < 10 ? '0' : '') + n;
          }

          // if weekend return true from here it self;
          if (this.getDay() == 0 ) { //agregar sabado o domingo
            return true;
          }

          var day = zeroPad(this.getMonth() + 1) + zeroPad(this.getDate());

          // if date is present in the holiday list return true;
          return !!~this.holidays.all.indexOf(day) ||     
            (this.holidays[this.getFullYear()] ?
        !!~this.holidays[this.getFullYear()].indexOf(day) : false);
        };
    </script>






Happy coding!!

Entradas populares de este blog

"php" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.

Dompdf image not found or type unknown

Laravel y MercadoPago SDK