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.

3 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
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.

Do NOT follow this link or you will be banned from the site!
WP Facebook Auto Publish Powered By : XYZScripts.com