Restar días laborales a una fecha
El problema que teníamos era muy simple. Nos daban una fecha, y nosotros debíamos calcular una nueva fecha que esté X cantidad de días laborales antes. Solo considerábamos como día no laboral los sábados y los domingos. Los feriados no era necesario contemplarlos.
Buscando un poco en internet encontramos el blog digital:pardoe en el cual dan dos algoritmos, uno para sumar días laborales, y otro para calcular la cantidad de días laborales entre dos fechas. Si bien no era exactamente lo que necesitaba, el adaptarlo para restar fue muy fácil. Aquí dejo mi código adaptado.
Idealmente (y si llegara a necesitarlo sería lo que haría) habría que hacer un método que si el paso un número negativo reste, y un número positivo sume.
Si bien la función que aquí muestro está codificada en groovy, la sintaxis debería ser lo suficientemente similar para que cualquier programador Java pueda adaptarla. También pueden haber algunos puntos polémicos, como el si se le restan 0 días laborales a un sábado. En este caso yo opté por retornar el mismo sábado, porque este comportamiento no me parecía incorrecto y se ajustaba mejor al negocio que tenía que modelar.
//
// A la fecha dada, le quita la cantidad de días laborales especificadas. O sea, sin contar sabados y domingos
// codigo inspirado de: http://digitalpardoe.co.uk/blog/show/116_Calculating_Work_Days_In_Java
//
static Date restarDiasLaborales(Date fecha, int dias) {
Calendar startCal = Calendar.getInstance();
startCal.setTime( fecha );
// Vamos al lunes siguiente si estamos en un fin de semana.
while (startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
for(int i = dias; i > 0; i--) {
startCal.add(Calendar.DAY_OF_MONTH, -1);
while (startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
{
startCal.add(Calendar.DAY_OF_MONTH, -1);
}
}
// la fecha retornada nunca puede ser superior a la fecha pasada por parametro
def fechaResultado = Utilidades.redondearDia(startCal.getTime())
def fechaIngresada = Utilidades.redondearDia(fecha)
if(fechaResultado > fechaIngresada) return fechaIngresada
else return fechaResultado
}
Discussion Area - Leave a Comment