yyyy validar sea restar rango que moment mayor inicio horas fin fechas fecha comparar actual javascript date

javascript - restar - validar que la fecha no sea mayor a la actual php



agregar/restar días hábiles en Javascript (5)

Haría un bucle. Siga agregando días hasta que llegue a un día que funcione.

Necesito una función Date.prototype.addBusDays que tomará un número entero como el número de días hábiles para agregar a la fecha.

Sin embargo, hay dos consideraciones: 1. Fines de semana, 2. Vacaciones (que imagino que sería una matriz preestablecida para comparar. Si la fecha de inicio y la de finalización contienen 3 días festivos, entonces se saca la fecha de finalización por 3)

He encontrado algunas secuencias de comandos en línea, un dilema que se me ocurre es, digamos que se dirigen todos los fines de semana primero, luego se hacen las vacaciones, ¿qué sucede si tiene +1 día (debido a vacaciones) y se introduce su fecha de finalización? un fin de semana de nuevo ... <

¿Algunas ideas? ¡Gracias!

EDITAR:

Esto forma parte de una herramienta de programación que estoy desarrollando, lo que significa que las fechas estarán vinculadas a tareas que están vinculadas entre sí. Agregar 1 día a una tarea, desencadenará un nuevo cálculo de todo lo relacionado con él, posiblemente todas las fechas en la base de datos.


Eche un vistazo a la siguiente implementación. Procedente de about.com

addWeekdays = function(date, dd) { var wks = Math.floor(dd/5); var dys = dd.mod(5); var dy = this.getDay(); if (dy === 6 && dys > -1) { if (dys === 0) {dys-=2; dy+=2;} dys++; dy -= 6; } if (dy === 0 && dys < 1) { if (dys === 0) {dys+=2; dy-=2;} dys--; dy += 6; } if (dy + dys > 5) dys += 2; if (dy + dys < 1) dys -= 2; date.setDate(date.getDate()+wks*7+dys); } var date = new Date(); addWeekdays(date, 9);


La solución de Datageek me ayudó pero necesitaba aumentarla. Esto todavía no hace vacaciones, pero sí días hábiles con la opción de incluir Sat y / o Sun, y admite agregar días negativos: -

function AddWorkingDays(datStartDate, lngNumberOfWorkingDays, blnIncSat, blnIncSun) { var intWorkingDays = 5; var intNonWorkingDays = 2; var intStartDay = datStartDate.getDay(); // 0=Sunday ... 6=Saturday var intOffset; var intModifier = 0; if (blnIncSat) { intWorkingDays++; intNonWorkingDays--; } if (blnIncSun) { intWorkingDays++; intNonWorkingDays--; } var newDate = new Date(datStartDate) if (lngNumberOfWorkingDays >= 0) { // Moving Forward if (!blnIncSat && blnIncSun) { intOffset = intStartDay; } else { intOffset = intStartDay - 1; } // Special start Saturday rule for 5 day week if (intStartDay == 6 && !blnIncSat && !blnIncSun) { intOffset -= 6; intModifier = 1; } } else { // Moving Backward if (blnIncSat && !blnIncSun) { intOffset = intStartDay - 6; } else { intOffset = intStartDay - 5; } // Special start Sunday rule for 5 day week if (intStartDay == 0 && !blnIncSat && !blnIncSun) { intOffset++; intModifier = 1; } } // ~~ is used to achieve integer division for both positive and negative numbers newDate.setTime(datStartDate.getTime() + (new Number((~~((lngNumberOfWorkingDays + intOffset) / intWorkingDays) * intNonWorkingDays) + lngNumberOfWorkingDays + intModifier)*86400000)); return newDate; }


Expandí la respuesta de khellendros74 para un proyecto mío que necesitaba deshabilitar los domingos y las vacaciones por correo en el selector de fechas y devolver dos fechas al presionar un botón: tres días hábiles (es decir, no festivos y no dominicales) después de la fecha elegida en el datepicker (un campo con una identificación de "calendario") y seis días hábiles después de la fecha elegida en el selector de fecha y luego coloca esos dos resultados en un par de campos de entrada deshabilitados (handDelivered and mailed). La pulsación del botón llama a la función calculateDates. Aquí está ese código:

var disabledDates = [''11/11/2015'', ''11/26/2015'', ''12/25/2015'', ''01/01/2016'',''01/18/2016'', ''02/15/2016'',''05/30/2016'', ''07/04/2016'',''09/05/2016'',''10/10/2016'',''11/11/2016'',''11/24/2016'', ''12/26/2016'',''01/02/2017'',''01/16/2017'', ''02/20/2017'',''05/29/2017'', ''07/04/2017'',''09/04/2017'',''10/09/2017'',''11/10/2017'',''11/23/2017'', ''12/25/2017'',''01/01/2018'',''01/15/2018'', ''02/19/2018'',''05/28/2018'', ''07/04/2018'',''09/03/2018'',''10/08/2018'',''11/12/2018'',''11/22/2018'', ''12/25/2018'',''01/01/2019'',''01/21/2019'', ''02/18/2019'',''05/27/2019'', ''07/04/2019'',''09/02/2019'',''10/14/2019'',''11/11/2019'',''11/28/2019'', ''12/25/2019'',''01/01/2020'',''01/20/2020'', ''02/17/2020'',''05/25/2020'', ''07/03/2020'',''09/07/2020'',''10/11/2020'',''11/26/2020'',''11/26/2020'', ''12/25/2020'']; $(function(){ $(''#calendar'').datepicker({ dateFormat: ''mm/dd/yy'', beforeShowDay: editDays }); function editDays(date) { for (var i = 0; i < disabledDates.length; i++) { if (new Date(disabledDates[i]).toString() == date.toString() || date.getDay() == 0) { return [false]; } } return [true]; } }); function calculateDates() { if( !$(''#calendar'').val()){ alert("Please enter a date."); document.getElementById(''calendar'').focus(); return false; } var dayThreeAdd = 0; var daySixAdd = 0; for (var i = 0; i < disabledDates.length; i++) { var oneDays = AddWorkingDays($(''#calendar'').val(),1,true,false); var twoDays = AddWorkingDays($(''#calendar'').val(),2,true,false); var threeDays = AddWorkingDays($(''#calendar'').val(),3,true,false); var fourDays = AddWorkingDays($(''#calendar'').val(),4,true,false); var fiveDays = AddWorkingDays($(''#calendar'').val(),5,true,false); var sixDays = AddWorkingDays($(''#calendar'').val(),6,true,false); if (new Date(disabledDates[i]).toString() == oneDays.toString()) { dayThreeAdd++; daySixAdd++; } if (new Date(disabledDates[i]).toString() == twoDays.toString()) { dayThreeAdd++; daySixAdd++; } if (new Date(disabledDates[i]).toString() == threeDays.toString()) { dayThreeAdd++; daySixAdd++; } if (new Date(disabledDates[i]).toString() == fourDays.toString()) { daySixAdd++; } if (new Date(disabledDates[i]).toString() == fiveDays.toString()) { daySixAdd++; } if (new Date(disabledDates[i]).toString() == sixDays.toString()) { daySixAdd++; } } var threeDays = AddWorkingDays($(''#calendar'').val(),(3 + dayThreeAdd),true,false); var sixDays = AddWorkingDays($(''#calendar'').val(),(6 + daySixAdd),true,false); $(''#handDelivered'').val((threeDays.getMonth()+1) + ''/'' + threeDays.getDate() + ''/'' + (threeDays.getYear()+1900)); $(''#mailed'').val((sixDays.getMonth()+1) + ''/'' + sixDays.getDate() + ''/'' + (sixDays.getYear()+1900)); } function AddWorkingDays(datStartDate, lngNumberOfWorkingDays, blnIncSat, blnIncSun) { datStartDate = new Date(datStartDate); var intWorkingDays = 5; var intNonWorkingDays = 2; var intStartDay = datStartDate.getDay(); // 0=Sunday ... 6=Saturday var intOffset; var intModifier = 0; if (blnIncSat) { intWorkingDays++; intNonWorkingDays--; } if (blnIncSun) { intWorkingDays++; intNonWorkingDays--; } var newDate = new Date(datStartDate) if (lngNumberOfWorkingDays >= 0) { // Moving Forward if (!blnIncSat && blnIncSun) { intOffset = intStartDay; } else { intOffset = intStartDay - 1; } // Special start Saturday rule for 5 day week if (intStartDay == 6 && !blnIncSat && !blnIncSun) { intOffset -= 6; intModifier = 1; } } else { // Moving Backward if (blnIncSat && !blnIncSun) { intOffset = intStartDay - 6; } else { intOffset = intStartDay - 5; } // Special start Sunday rule for 5 day week if (intStartDay == 0 && !blnIncSat && !blnIncSun) { intOffset++; intModifier = 1; } } // ~~ is used to achieve integer division for both positive and negative numbers newDate.setTime(datStartDate.getTime() + (new Number((~~((lngNumberOfWorkingDays + intOffset) / intWorkingDays) * intNonWorkingDays) + lngNumberOfWorkingDays + intModifier)*86400000)); return newDate; }


Solución simple para resolver todo el problema; puede recorrer los días para omitir los días de la semana y los días festivos:

Date.prototype.holidays = { // fill in common holidays all: [ ''0101'', // Jan 01 ''1225'' // Dec 25 ], 2016: [ // add year specific holidays ''0104'' // Jan 04 2016 ], 2017: [ // And so on for other years. ] }; 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 || this.getDay() == 6) { 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); }; // Uasage var date = new Date(''2015-12-31''); date.addWorkingDays(10); alert(date.toDateString()); // Mon Jan 18 2016 date.substractWorkingDays(10); alert(date.toDateString()) // Thu Dec 31 2015