lunes, 23 de abril de 2012

Averiguar el primer y último viernes de un mes con Java



A finales del 2011 desarrolle un proyecto que tomaba la asistencia de personas en  una oficina por medio de un dispositivo biometrico de huella digital. A la hora de generar los reportes de porcentaje de asistencia, calculaba un promedio de asistencia, si una persona solo asistía los viernes lo promediaba a 4 veces, pero el tiempo no es fácil de manejar, existe una anomalía, la cual es que ciertos meses una persona asiste 5 veces y en otras ocasiones 4. En febrero 2012 hay 4 viernes, y en Marzo 2012 hay 5 viernes.
Esto vuelve el sistema inexacto, así que procede por investigar como averiguar cuantos viernes tiene un determinado mes, la lógica me dicto, saber la fecha del último viernes, y la del primer viernes, para poder encontrar la fórmula. 


Calcular el último viernes.

  1. Calendar pCal=java.util.GregorianCalendar.getInstance();
  2. pCal.set(GregorianCalendar.YEAR,2012);
  3. pCal.set(GregorianCalendar.MONTH,GregorianCalendar.APRIL);
  4. pCal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);
  5. pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
  6. System.out.pritnln("Ultimo viernes: " + pCal.get(GregorianCalendar.DAY_OF_MONTH);


1. Se crea una una instancia de un calendario gregoriano
2. Se indica el año
3. Se indica el mes que se desea, GregorianCalendar presenta  los meses en ingles
4. Se indica el  día por medio de GregorianCalendar
5. Este es la que importa, el -1 indica el último viernes, no parece lógico a simple vista pero funciona.
6. Se imprime  la instancia del calendario accediendo  pCal.get  indicando que deseamos el número de día en el mes indicado.


Calcular el primer viernes


Es similar a la anterior, solo cambia el parámetro del inciso 5


5.  pCal.set(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, 1);


Se cambia a "1" lo que indica que se desea es el primer viernes


Y con esto sabemos la fecha del primer y ultimo viernes de un mes, para poder realizar cálculos con respecto al tiempo, esta solución me fue muy buena, debido que lo primero que vino a mi mente fue un cubo de Datawarehouse, pero no se tienen los recursos para esa solución.