Fecha y hora: El tiempo de Java

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.

De fecha a instante

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.


Me encantaría recibir cualquier tipo de comentarios sobre esta página. ¿Qué pongo? ¿Qué saco? Hecho por Nicolás Lichtmaier.

HTML 4.01 estricto válido

Creative Commons License
Licenciado bajo la licencia Creative Commons Attribution 3.0.