miércoles, noviembre 15, 2006

Fechas under Java - Calendar, getInstance(), get(), set(), add(), compareTo()

La clase a utilizar será Calendar de java.util. Esta clase nos brinda información sobre todo lo que tenga que ver con el tiempo, es muy completa, las zonas horarias que utilizamos, y cualquier cosa que se nos pueda ocurrir.
Como es un clase abstracta, no puede ser instanciada, es decir que no tendrá un constructor típico “new Calendar()”, en ves de ello utilizaremos el método getInstance()

Calendar fecha= Calendar.getInstance();

En fecha quedaran almacenados los datos del sistema (hora, fecha) del momento en que fue creada, si pretendemos ver que tipos de datos maneja, podemos hacer uso del método toString()

System.out.println(fecha.toString());

Obteniendo y poniendo Fechas

Para asignar valore y obtenerlos utilizaremos los métodos get() y set(). Pero primero lo primero, las constantes que nos permiten setear son enteros por lo que deberemos guardarlos o poner enteros. Las agregaría acá pero con solo poner un “.” En su IDE favorito se desplegaran todas las que se imaginan y un poquito mas.

Comenzaremos por obtener los datos

//calendar.get(int campo);
Int hora = fecha.get(Calendar.HOUR);

Siempre deberemos utilizar el nombre de la clase un punto y la constante deseada. Las constantes más communes a utlilizar son HOUR, HOUR_OF_DAY, MINUTE, SECOND, DAY_OF_MONTH, MONTH, YEAR, DAY_OF_WEEK, DAY_OF_WEEK_IN_MONTH. Estas ultimas nos sirven para cuando queremos trabajar con los días de la semana como lunes, martes… etc. Nos devolverá un número que mas tarde podremos convertirlo en un String.

Poner los datos deseados
podemos poner un solo dato...
Int hora = 13;

//calendar.set(int campo,valor);
fecha.set(Calendar.HOUR_OF_DAY, hora);

o todos los que deseamos a la ves...
fecha.set(int años, int mes,int dia);
fecha.set(int año,
int mes,int dia,int hora_del_dia, int minutos)
fecha.set(
int año,int mes,int dia,int hora_del_dia, int minutos, int segundos);

Si vamos a trabajar con horas, debemos hacer la distinción ente HOUR y HOUR_OF_DAY, la primera nos mostrará la hora de 0-11 y la segunda de 0-23. Si vamos a trabajar con meses deberemos restarle uno, así por ejemplo noviembre será el mes 10.

Sumar a una Fecha

para sumarle a una variable de tipo Calendar podemos utilizar el método add(), aunque si se desea se puede utilizar el método roll().

//Calendar.add(int campo, int aumento)
hora.add(Calendar.HOUR_OF_DAY,2);

Así se incrementaran dos horas, a la hora de la instancia. Trabajo similar se puede realizar con cualquiera de las constantes.
El método roll() tiene dos formas:
El primero de ellos tiene un comportamiento similar al del metodo add() pero la diferencia yace en que se incrementara sin cambiar los campos superiores. Por ejemplo se incrementaran los minutos pero cuando se produzca un incremento en la hora, esta no cambiara a difrencia de add(). Y la llamada al metodo puede ser de dos formas:

//1) fecha.roll(int campo, int incremento);

El segundo es como un contador
//2) fecha.roll(int campo, boolean arriba);
Dependiendo del valor boolean se incrementara en uno hacia arriba o decrementara hacia abajo.

Compardando dos calendarios
El metodo a utilizar es compareTo(Calendar otro)

//Calendar.compareTo(Calendar otro_calendario)
Calendar hora1= Calendar.getInstance();
Calendar hora2=Calendar.getInstance();
hora2.add(Calendar.MINUTE,1);
int d =hora1.compareTo(hora2);

Nos devolverá -1 si hora1 es menor que hora2, 0 si son iguales, y 1 si el primero es mayor que el segundo.

Sacando diferencias entre calendarios

Yo en este caso utilice formulas matemáticas para sacar diferencias entre los calendarios, también se puede sacar las diferencias entre milisegundos, pero esas diferencias igualmente se deben convertir, es por ello que preferí crear mis propios métodos. Por ejemplo para sacar la diferencia en minutos entre una hora y otra en el mismo dia…

Int diferencia = (hora1.get(Calendar.HOUR_OF_DAY)*60+ hora1.get(Calendar.MINUTE)) -(hora2.get(Calendar.HOUR_OF_DAY)*60+ hora2.get(Calendar.MINUTE))

Y jugando con valores negativos y positivos.
Tan simple como lo visto es trabajar con calendarios. Espero haber ayudado.