Obtener dias habiles entre un rango de fechas en java

Dias habiles

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.

4 comments
  1. Bitacoras.com
    octubre 17, 2010 at 2:14 am

    Información Bitacoras.com…

    Valora en Bitacoras.com: Aqui le dejo un metodo para obtener los dias habiles entre 2 fechas en java con la Clase Calendar dias habiles me refiero a que son los dias que normalmente se labora en otras de lunes a viernes los fines de semana no cuentan…..

    Reply
  2. Miguel Angel
    Miguel Angel
    octubre 27, 2015 at 1:36 am

    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!!!

    Reply
  3. Juan José Carmona Martinez
    Juan José Carmona Martinez
    septiembre 27, 2021 at 5:03 am

    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;
    }

    Reply
Leave a Reply

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.