Aqui le dejo un método para obtener los dÃas hábiles entre 2 fechas en java con la Clase Calendar dÃas hábiles me refiero a que son los dÃas que normalmente se labora me refiero de lunes a viernes, los fines de semana no cuentan como dÃas hábiles en este código.
/** * * @param fechaInicial * @param fechaFinal * @return dias habiles */ public int getDiasHabiles(Calendar fechaInicial, Calendar fechaFinal) { int diffDays= 0; //mientras la fecha inicial sea menor o igual que la fecha final se cuentan los dias while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) { //si el dia de la semana de la fecha minima es diferente de sabado o domingo if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY || fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) { //se aumentan los dÃas de diferencia entre min y max diffDays++; } //se suma 1 dia para hacer la validación del siguiente dia. fechaInicial.add(Calendar.DATE, 1); } return diffDays; }
Si también se quisiera descartar los dÃas festivos tendrán que definir un calendario con las fechas de los dÃas festivo.
Buenas. Este método tiene un pequeño problema. Se trata del caso en el que la fecha fin coincida con fin de semana, y estemos tratando el viernes de dicha semana. Al pasar del jueves al viernes aumentará uno el contador, pero no deberÃa. Se puede observar este error, por ejemplo, introduciendo 11/01/2012 como fecha inicio (miércoles), y 15/01/2012 como fecha fin (domingo). En este caso solamente deberÃamos obtener dos dÃas, pero obtenemos tres. De esta forma lo podemos solucionar:
/**
* Validación para evitar problemas en rutina de cálculo de dÃas entre fechas, excluyendo fines
* de semana.
* En el caso de que la fecha fin sea en fin de semana, fecha inicio y fecha fin pertenezcan a la
* misma semana, y el dÃa sea viernes, no hay que tenerlo en cuenta, para evitar generar un dÃa de
* más en el conteo.
*/
private static boolean validaFechaFinEnFinSemanaMismaSemanaYFechaOrigenViernes(final Calendar fechaInicial, final Calendar fechaFinal){
boolean bResultado = false;
if(fechaFinal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY &&
fechaFinal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY){
return bResultado;
} else {
// Si la fecha final es fin de semana comprobamos si fecha inicio y fecha fin pertenecen
// a la misma semana.
if(fechaFinal.get(Calendar.YEAR) == fechaInicial.get(Calendar.YEAR) &&
fechaFinal.get(Calendar.MONTH) == fechaInicial.get(Calendar.MONTH) &&
fechaFinal.get(Calendar.WEEK_OF_MONTH) == fechaInicial.get(Calendar.WEEK_OF_MONTH)){
// Si la fecha inicio es viernes, estaremos en el caso de excepción.
if(fechaInicial.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){
bResultado = true;
}
}
}
return bResultado;
}
Agregando este código a la validación de si es sábado o domingo (ojo, con ! delante), se resuelve este pequeño bug.
¡¡¡Un saludo!!!
Solo se tenÃa que cambiar el operador || por && y el calculo ya lo hace bien
public static int getDiasHabiles(Calendar fechaInicial, Calendar fechaFinal) {
int diffDays = 0;
// mientras la fecha inicial sea menor o igual que la fecha final se cuentan los
// dias
while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) {
// si el dia de la semana de la fecha minima es diferente de sabado o domingo
if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY
&& fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
// se aumentan los dÃas de diferencia entre min y max
diffDays++;
}
// se suma 1 dia para hacer la validación del siguiente dia.
fechaInicial.add(Calendar.DATE, 1);
}
return diffDays;
}