El tiempo de Java... suena a tÃtulo de proclama triunfal sobre la superioridad de Java en nuestra época. Sin embargo sólo vamos a tratar acerca del problema de expresar y manipular variables que contengan instantes en el tiempo. Una de las cosas simpáticas de la computación es que nos da la oportunidad de acceder pedacitos de conocimiento de cosas interesantes y no relacionadas. Y uno de esos conocimientos es el conocimiento del tiempo.
PodrÃa paeceer a primera vista que no hay nada de complicado en la hora. Decimos que esa chica no nos dio "ni la hora", porque dar la hora es lo más simple que alguien podrÃa danos. Pero sabemos que no es cierto si empezamos a tomar en cuenta conceptos como años bisiestos, el cálculo de en qué dÃa de la semana cae determinada fecha...
Pero antes de meterse en todos esos conceptos está la noción de instante en el tiempo. Antes de pensar en qué mes, de que año, existe la idea de un instante en el tiempo. Eso en Java se maneja con un número de milisegundos transcurridos a partir de 1970. Bueno, no exactamente. Son los milisegundos desde 1970 si no hubiera habido segundos intercalares.
Java tiene una clase para manipular estos instantes, y asà nos ahorra
andar pasando variables numéricas. La clase para esto es Date. El
constructor sin parámetros de Date nos da un objeto que representa al
instante actual. Con instantes puros es poco lo que podemos hacer. No
sabemos verlos en meses, años... eso requiere calcular. Por lo tanto las
únicas operaciones que se pueden hacer son ver si dos fechas son iguales
(con equals()
, como con cualquier objeto), o si una está antes
que otra (con before()
y after()
).
Ejemplo:
class CosaEfÃmera { Date expiración; // ... public boolean yaExpiró() { Date ahora = new Date(); return ahora.after(expiración); } }
La cuestión es que sin conocimiento de meses, años y demás no podemos no siquiera convertir en fecha lo que entra un usuario! Este conocimiento se encuentra en las clases que descienden de Calendar. La idea en el diseño de esta API es que pudieran existir distintos Calendar: Un JewishCalendar, JulianCalendar, etc. Cada uno con una estrategia distinta para convertir instantes puros en especificaciones completas de mes-dÃa-año. Sin embargo, casi nadie necesita esa funcionalidad, por lo que la única subclase que se utiliza es GregorianCalendar.
La clase calendar está mal diseñada. Una instancia de Calendar no sólo encapsula la estrategia de un calendario, sino que además suple a la clase Date. Esto es porque un Calendar almacena internamente una fecha y podrÃa perfectamente usarse entonces para intercambiar fechas entre partes de la aplicación. Sin embargo este uso no es común. Lo más común es usar el Calendar y después sacarle el objeto date creado y descartar el primero. A continuación muestro algunas formas de usar una clae Calendar.
Si nos interesa obtener el objeto Date correspondiente a una fecha conocida podemos simplemente usar los constructores de GregorianCalendar. Por ejemplo, para el 14/5/1975 uno hará new GregorianCalendar(1975,4,14).
¡Continuará!
Vea mis otros artÃculos sobre programación en Java.
Licenciado bajo la licencia
Creative
Commons Attribution 3.0.