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??
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.
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
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);
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?
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.
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++;
}
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 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?
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