Programación en castellano
Inicio > Foros > Java (Servlets y JSP) > Alguien sabe como calcular el número de días laborables entre dos fechas????
-Foros de debate

Java (Servlets y JSP)
Lista de foros | Lista de mensajes de este foro

Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.

Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por merchues el día 9 de marzo de 2005

Holas!!

Tengo un problemilla, tengo que calcular el número de días que hay entre dos fechas, teniendo en cuenta los festivos de la provincia seleccionda (qu los tngo en una tabla).

Para eso tngo que saber el número de días que hay entre esas dos fechas, y quería preguntar si hay alguna manera en jsp o javascript de calcular el número de sabados y domingos que hay entre dos fechas, para luegos asi restarselos a la diferencia de las fechas, y de hay tb restarle tb el numero de días festivos.

Es la manera qu he pesado...alguna otra manera de hacerlo??

Gracias. Un saludito.

 
Re: Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por David el día 9 de marzo de 2005

Hola

Pues sólo se me ocurre con un bucle desde la fecha inicial hasta la final.

Cargas un Calendar con la fecha inicial y vas incrementándolo día a día con add(Calendar.DATE, 1). A la vez, y si la comprobación get(Calendar.DAY_OF_WEEK) es distinta de Calendar.SATURDAY y de Calendar.SUNDAY, vas incrementando el contador de días laborables. Luego le restas el número de festivos entre ambas fechas y andando. El problema viene si te mandan calcular el número de días laborables entre la coronación de Tutankamon y la proclamación de la IV República Galáctica, pero tampoco sería demasiado jevi.

Salud

David

 
Re: Re: Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por merchues el día 9 de marzo de 2005


Muxas gracias.

Tb lo había pensado así, pero intente hacer de está manera para que fuera más rapido, pero me casca...asik imagino que alfinal lo hare con el bucle:


GregorianCalendar fecIni = new GregorianCalendar (y,m-1,d);

int diaSem = fecIni.get (Calendar.DAY_OF_WEEK);

//Tratar la primera semana
if (diaSem!= 7 && diaSem!=1) //Sabado o Domingo
nMax = nMax - 5 (diaSem-2);
nDiasTot = nDiasTot + (7-diaSem-2));
}
//Resto de semanas
if (nMax > 5) { //Más de una semana
nDiasTot = nDiasTot + nMax + (nMax / 5) * 2); // todos los días de la semana
}
nDiasTot = nDiasTot + 5 - nMax %5;

//Después ya añadirira los festivos que con una select que me he montado saco los que hay entre esa fecha

Ciao.

 
Re: Re: Re: Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por David el día 10 de marzo de 2005

Hola otra vez y mil perdones por la respuesta estúpida de ayer. Es increíble lo que hacen varias horas de trabajo intenso sobre el cerebro...

La solución a un problema con un bucle es espantosa cuando éste se puede resolver también con simples cálculos aritméticos. Te cuento:

Lo que necesitamos, a grosso modo, es saber el número de días, sin contar sábados ni domingos, que hay entre dos fechas arbitrarias dentro del mismo año (se podría generalizar a fechas arbitrarias complicando un poco el algoritmo, pero hago esta restricción para partir de una base sencilla).

Básicamente, esto consiste en obtener el número de días NATURALES existentes entre ambas fechas y restarle a esa cifra el número de sábados y domingos existentes entre ambas, o sea, el número de semanas de diferencia entre ambas fechas multiplicado por dos.

Habrá que tener en cuenta, eso sí, que las fechas de inicio y de fin no sean ni sábado ni domingo, en cuyo caso se haría un ligero ajuste: si la fecha inicial es sábado o domingo se asigna a la fecha inicial el siguiente lunes, y si es la final una de las no deseadas, se asigna a ésta el viernes anterior.

El algoritmo queda como que así:

int diasLaborables(Calendar fecIni, Calendar fecFin) {
if (fecIni.before(fecFin)) {
int diaSemIni = fecIni.get(Calendar.DAY_OF_WEEK);
int diaSemFin = fecFin.get(Calendar.DAY_OF_WEEK);

// Si alguno de los días es sábado o domingo, lo lleva al
// siguiente (ini) o anterior (fin) laborable
if (diaSemIni == Calendar.SATURDAY)
fecIni.add(Calendar.DATE, 2);
else if (diaSemIni == Calendar.SUNDAY)
fecIni.add(Calendar.DATE, 1);
if (diaSemFin == Calendar.SATURDAY)
fecFin.add(Calendar.DATE, -1);
else if (diaSemFin == Calendar.SUNDAY)
fecFin.add(Calendar.DATE, -2);

int numNatur = (int)(fecFin.getTimeInMillis() / 86400000 - fecIni.getTimeInMillis() / 86400000);
int numLabor = numNatur;

int semIni = fecIni.get(Calendar.WEEK_OF_YEAR);
int semFin = fecFin.get(Calendar.WEEK_OF_YEAR);

if (semIni < semFin)
numLabor -= (semFin - semIni) * 2;

return numLabor;
}
else
throw new IllegalArgumentException();
}


Si las fechas están en distintos años, habrá que calcular el número de semanas de diferencia entre ambos años. Bueno, habrá que pensar un poco, pero por algo se empieza, ¿no?

Salud

David

 
Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables entre dos fechas??
Enviado por merchues el día 11 de marzo de 2005

Holas!! muxas gracias, alfinal ya lo he sacado :-), joe q torpecita, viendo tu codigo me di cuenta q me faltaba tratar los fines de semana, lo he sacado como lo plante la primera vez, pero con alguna pequeña modificación.

Ademas calculando el número de días con la clase
GregorianCalendar no necesitas hacer nada con lo años ya te lo calcula el solito, vamos una maravilla.

Bueno el luenes lo pongo pa que lo heches un vistazo, q se me ha pirado hoy.

Bueno un saludo y muchas gracias.

 
Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables entre dos fech
Enviado por Artuof el día 16 de marzo de 2005

Bueno, suelo programar en php y buscaba un algoritmo para calcular el numero de domingos entre dos fechas, pero creo que el algoritmo tiene un pequeño fallo, y es que el numero de semanas no tiene pq decirnos el numero de domingos, ni tampoco si la fecha final o inicial es domingo. Os pongo un supuesto:
Fecha inicial: 18-03-05
Fecha final: 22-03-05
Numero de semanas entre ambas = 0;
Ni fecha inicial ni final es domingo, y el numero de domingos es 1.

No se, por lo que he entendido en tu algoritmo no creo que sea válido.

Os propongo una idea:
dias = 0;
Fecha Inicial++;
while (FechaInicial <= FechaFinal){
If ( Fecha Inicial != Domingo)
dias++;
FechaInicial++;
}

Creo que es lo más rápido y fácil





 
Re: Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables entre dos
Enviado por David el día 16 de marzo de 2005

Hola

El número de semanas en el ejemplo que me dices es 1. El número de semanas lo calculo restando el número de semana del año de la fecha final del número de semana del año de la fecha inicial.

También tengo en cuenta que la fecha inicial sea sábado o domingo, en cuyo caso retraso o adelanto hasta el día laborable adecuado.

Así que ¿cuál es el problema?.

Además mi solución (aunque como dije no es válida para fechas situadas en distinto año, pero fácilmente modificable para que las acepte) es no iterativa.


Salud

David

P.S.- No existe un código óptimo, así que cualquier mejora siempre será bien recibida.

 
Re: Re: Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables entre
Enviado por Artuof el día 16 de marzo de 2005

Ok, no sabía que disponias de una funcion que te decía la semana del año de una fecha, creo que en php no existe, por lo que habría que implementarla, y creo que al final todo ese proceso se haría de manera iterativa.
Lo mejor de las fechas es trabajar con el timestamp de UNIX, y solo saber que un día son 86400 segundos.

Así, aunque de forma iterativa, todo resulta sencillo.
Mirad mi funcion:
function dias_habiles($finicial, $ffinal){
$dias = 0;
$finicial += 86400;
while ($finicial <= $ffinal){
if(date("l",$finicial) != 'Sunday')
$dias++;

$finicial += 86400;
}
return $dias;
}

Es solo otra opción, iterativa, pero mucho más facil y simple.

 
Re: Re: Re: Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables en
Enviado por Daneel el día 31 de marzo de 2005

En PHP saber el número de la semana es tan fácil como esto:

$semana = date(\"W\", time());

Esto calcula el número de la semana de la fecha de hoy.


Saludets.

 
Re: Re: Re: Re: Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborable
Enviado por David el día 2 de abril de 2005

Mmmmmm, creo que me he perdido... ¿estamos un foro de Java o de PHP?

 


Re: Re: Re: Re: Re: Re: Re: Re: Alguien sabe como calcular el número de días laborables en
Enviado por Llave el día 29 de noviembre de 2007

Si, coincido en que la opción iterativa es mas fácil y simple para un caso concreto.
Ahora, añádele que estés haciendo un listado con calculos de las horas trabajadas de los empleados de una empresa.
Hacer el recorrido iterativo de semejante tarea es igual a darle al botón "calcular" e irte a tomar un café de 10 minutos suponiendo que debido a tantos accesos el servidor te tire fuera...

Sinceramente, prefiero la opción no iterativa, es mejor en todos los sentidos. Quizás más complicada de entender, pero en rendimiento es 1000 veces mejor.

Bueno, tras este breve comentario, quería plantear una pregunta a David.

Yo utilizo un método no iterativo parecido al tuyo. En la actualidad no me funciona por culpa del calculo de la semana anual del Calendar.

Seré más concreto, tomándo como fechas límite: días en la última semana del año o la primera semana del año Calendar se me vuelve loco, ya que (no sé si lo sabeis) para un año concreto (por ejemplo el 2007) para Calendar, la última semana del año y la primera del siguiente son LA MISMA.

No sé si ves el mismo problema que yo David. Alguna solución?

Gracias.

 








Re: Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por Corys90 el día 1 de abril de 2005

te cuento como debes realizar la diferencia y tu lo pasas a java o jsp.

Formula Gral
ff = fecha final y fi = fecha inicial
ndias = ff(d-m-a) - fi(d-m-a)

si dia de ff < dia de fi entonces sumale 30 o 31 dias a dia de ff y resta los dias de las fechas. (si sumas 30 o 31 dias recuerda que debes restarle 1 al mes de ff). de lo contrario, la resta se realiza normalmente.

la misma operacion para restar los meses de ambas fechas. si mes de ff < mes de fi entonces sumale 12 a mes de ff y luego restas ambos meses.(recuerda que debes restar 1 al año).

luego resta los años.

lo ilustro con un ejemplo.

nota : la fecha mas actual es la ff y la vieja es la fi

ff = 15-07-2005
fi = 31-03-2005

como dia de ff es < que la otra, entonces sera
dias = (15 + 30) - 31 // (restale 1 al mes de ff entonces mes de ff es 06). en caso que no sea <, resta normalmente.

luego mes = 06 - 03 y año = 05 - 05
resultado total
dia = 14, mes = 03 y año = 00
total dias = (14 + (03 * 30) + (00 * 365)) = 104 dias

tu restales los dias festivos.

espero te sirva, cualquier cosa me emaileas

 
Re: Re: Alguien sabe como calcular el número de días laborables entre dos fechas????
Enviado por Peps el día 5 de abril de 2005

Para eso coges el calendario y te pones a contar a mano. Así es mas eficiente.

 



Tienda
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados