Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/08/2007, 08:05
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: Calcualr días laborables entre dos fechas

Bueno, sin calcular días de festividad sería fácil. Basta con sumar día por día, pero si es sábado o domingo no contabilizar como sumado el día, y seguir sumando. Es decir:

Hoy es viernes, sumo uno. Es sábado, entonces la suma no cuenta, luego sigo sumando uno. Es domingo, entonces la suma no cuenta, luego sigo sumando uno. Es lunes.


Así podemos conseguir sumar tantos días como quieras con un simple bucle (de aquí seguramente sólo te interese el método en cuestión, pero he puesto el resto más que nada porque ayudan a ver la fecha mas bonita )

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<
html>
<
head>
<
titlePágina nueva </title>
<
meta name="Author" content="derkeNuke">
<
style type="text/css">
</
style>
</
head>

<
body>

<
script type="text/javascript">
function 
e(q,br) {
document.body.appendChilddocument.createTextNode(q) );
if(!
brdocument.body.appendChilddocument.createElement("BR") );
}

// Creo una fecha
var hoy = new Date();

// Nuestro método para sumar n dias (que no sean ni Sábado ni Domingo)
Date.prototype.sumarLaborables = function(n) {
    for(var 
i=0i<ni++) {
        
this.setTimethis.getTime()+24*60*60*1000 );
        if( (
this.getDay()==6) || (this.getDay()==0) )    // sábado o domingo
            
i--;            // hacemos el bucle una unidad mas larga.
    
}
    return 
this;
}

// COMPLETAMOS CON CEROS A LA IZQUIERDA AQUELLOS VALORES QUE LO NECESITEN PARA VERLOS BONITOS
Date.prototype.getXXXzeroFilled = function(propiedad) {
    var 
dev this["get"+propiedad]();
    if( (
propiedad=="Milliseconds") && (dev<100) && (dev>9) ) dev "0"+dev;
    else if( 
dev<10 dev = (propiedad=="Milliseconds")?"00":"0"+dev;
    return 
dev.toString();
}
Date.prototype.getHoursZeroFilled = function() { return this.getXXXzeroFilled("Hours"); }
Date.prototype.getMinutesZeroFilled = function() { return this.getXXXzeroFilled("Minutes"); }
Date.prototype.getSecondsZeroFilled = function() { return this.getXXXzeroFilled("Seconds"); }
Date.prototype.getMillisecondsZeroFilled = function() { return this.getXXXzeroFilled("Milliseconds"); }



// REESCRIBIMOS EL MÉTODO TOSTRING() PARA REPRESENTARLO EN CASTELLANO BONITO
Date.prototype.toString = function() {
    var 
diaSem = ["Domingo""Lunes""Martes""Miércoles""Jueves""Viernes""Sábado"][ this.getDay() ];
    var 
mes "Enero;Febrero;Marzo;Abril;Mayo;Junio;Julio;Agosto;Septiembre;Octubre;Noviembre;Diciembre".split(";")[this.getMonth()];
    var 
str diaSem+", "+this.getDate()+" de "+mes+" de "+this.getFullYear()+" a las "+this.getHoursZeroFilled()+":"+this.getMinutesZeroFilled()+":"+this.getSecondsZeroFilled()+" "+this.getMillisecondsZeroFilled()+".";
    return 
str;
}

e(hoy);
for(var 
i=0i<15i++) {
    
hoy.sumarLaborables(1);
    
ehoy );
}

e(""); e("");
e( new Date().sumarLaborables(15) );

</script>
</body>
</html> 
Puedes sumar la cantidad de días laborables que quieras, como ves.


Con días festivos, bastaría con tenerlos en un array y comprobar (tal y como hacemos con los sábados y domingos) si el día cuenta como laborable o no.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.