1. Dateclase y tiempo Unix

Desde el comienzo de Java, el lenguaje ha tenido una clase especial para trabajar con horas y fechas: Date. Con el tiempo, aparecieron varias clases más para trabajar con fechas, pero los programadores continúan usando la Dateclase incluso hoy.

Esto se debe a que es muy simple y conveniente. Y como programador, definitivamente lo encontrará en cualquier proyecto real. Usarlo o no es tu elección, pero debes saberlo. Así que dale unos minutos de tu precioso tiempo.

¿ Qué hace que la Dateclase sea tan buena? Su sencillez.

La Dateclase almacena información de fecha y hora como la cantidad de milisegundos que han transcurrido desde el 1 de enero de 1970. Son muchos milisegundos, por lo que el longtipo se usa para almacenarlos.

Interesante.

¿Por qué desde 1970 específicamente? Este es el llamado tiempo de Unix : es cómo el sistema operativo Unix, que es el abuelo de todos los sistemas operativos modernos, mantiene el tiempo.

Pero puede averiguar fácilmente cuánto tiempo ha pasado entre dos fechas: simplemente reste una fecha de la otra y obtendrá la diferencia de tiempo entre las fechas al milisegundo más cercano.

Estos son algunos ejemplos útiles de cómo trabajar con la Dateclase.


2. Obtener la fecha actual

Para obtener la hora y la fecha actuales, simplemente cree un Dateobjeto. Cada nuevo objeto almacena la hora en que se creó. Parece muy simple:

Date current = new Date();

Después de ejecutar este comando, la currentvariable almacenará una referencia al Dateobjeto creado, que almacenará internamente la hora de su creación, la cantidad de milisegundos que han transcurrido desde el 1 de enero de 1970.

Visualización de la fecha actual en la pantalla

Para mostrar la fecha actual, simplemente: a) cree un nuevo Dateobjeto, b) imprímalo en la pantalla usando el System.out.println()método.

Ejemplo:

Código Salida de consola
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Esto es lo que significa la salida de la consola:

Texto Interpretación
jueves _ Jueves
21 de febrero 21 de febrero
14:01:34 horas : minutos : segundos
EET Zona horaria: Hora de Europa del Este
2019 Año

3. Establecer una fecha específica

Descubrimos cómo obtener la hora actual, pero ¿cómo creamos un Dateobjeto que almacena una fecha u hora diferente?

Una vez más, todo es simple aquí. Para establecer una fecha específica, debe escribir un código como este:

Date birthday = new Date(year, month, day);

Todo es simple y obvio, pero hay dos matices a tener en cuenta:

  1. El año debe contarse desde 1900.
  2. Los meses se numeran desde cero.
Interesante.

Este es otro legado del sistema operativo Unix: en Unix, los programadores indicaban el año con dos dígitos. En lugar de 1977, simplemente escribieron 77. Así que 77 es el año correcto si contamos desde 1900.

Por ejemplo, nací el 21 de marzo de 1989. Marzo es el tercer mes, entonces necesito escribir:

Código Salida de consola
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Los meses están numerados desde cero, pero los días no. Eso es un poco extraño, ¿verdad?

Creemos que los verdaderos programadores deberían haber prevalecido y numerado los días del mes desde cero también. Ay, estos conformistas 🙂

Establecer un tiempo específico

Establecer un tiempo específico también es bastante simple: para esto, debe escribir una declaración como esta:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Las horas, los minutos y los segundos están numerados desde cero: deja que el programador que llevas dentro respire aliviado.

Ejemplo:

Código Salida de consola
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Fijamos la hora 12:15 y la fecha 4 de junio de 2005 . Esto es un poco difícil de leer para un no programador, pero funciona como debería.


4. Trabajar con elementos de una fecha

Puede hacer más con un Dateobjeto que simplemente mostrarlo. Tiene métodos que le permiten obtener elementos individuales de la fecha almacenada internamente:

Método Descripción
int getYear()
Devuelve el año de la fecha relativo a 1900.
int getMonth()
Devuelve el mes de la fecha (los meses se numeran desde cero)
int getDate()
Devuelve el día del mes.
int getDay()
Devuelve el día de la semana.
int getHours()
Devuelve las horas
int getMinutes()
Devuelve los minutos
int getSeconds()
Devuelve los segundos

Ejemplo:

Código Salida de consola Nota
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
junio
día del mes
sábado

Por cierto, un Dateobjeto no solo te permite obtener elementos individuales de una fecha, sino también cambiarlos:

Método Descripción
void setYear(int year) Cambia el año de la fecha. El año se indica relativo a 1900.
void setMonth(int month) Cambia el mes de la fecha (los meses se numeran desde cero)
void setDate(int date) Cambia el día del mes
void setHours(int hours) Cambios de horario
void setMinutes(int minutes) Cambia minutos
void setSeconds(int seconds) Cambia segundos

5. Milisegundos

Como dijimos anteriormente, el Dateobjeto almacena la cantidad de milisegundos que han transcurrido desde el 1 de enero de 1970.

Si necesitamos ese número, podemos obtenerlo del Dateobjeto:

long time = date.getTime();

El getTime()método devuelve el número de milisegundos almacenados dentro del Dateobjeto.

No solo puede obtener el número de milisegundos, sino que también puede cambiar ese número en un objeto existente:

Date date = new Date();
date.setTime(1117876500000L);

Por cierto, puedes escribir esto de manera aún más concisa pasando el tiempo al Dateobjeto justo cuando se crea:

Date date = new Date(1117876500000L);

6. Comparar fechas

Si quieres comparar dos fechas y saber cuál fue primero, tienes tres opciones

La primera forma es simplemente comparar la cantidad de milisegundos que almacena cada uno:

if (date1.getTime() < date2.getTime())

La segunda forma es usar el before()método de un Dateobjeto:

if (date1.before(date2))

Se lee así: si date1viene antes date2, entonces...

La tercera forma es usar el after()método de un Dateobjeto:

if (date2.after(date1))

Se lee así: si date2es después de date1, entonces...


7. DateFormatclase

Recuerde, cuando mostramos la fecha en la pantalla, vimos algo como esto: Thu Feb 21 14:01:34 EET 2019. Todo parece correcto, pero el formato es más como se mostraría una fecha para los programadores que para los humanos normales. Queremos mostrar la fecha más claramente para los usuarios. Algo Tuesday, February 21como

Y sin el año. O con un año, si es necesario. En general, queremos poder mostrar la fecha de diferentes maneras.

Hay una clase especial para esto: SimpleDateFormat.

Ejemplo:

Código
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Salida de consola
Jun-04-2005

Mira lo que muestra el programa: Jun-04-2005. Eso no es en absoluto lo que solía ser.

La diferencia es que no mostramos el Dateobjeto en sí, sino una cadena especial obtenida al llamar al format()método en un SimpleDateFormatobjeto. Pero ese ni siquiera es el punto principal aquí.

Cuando SimpleDateFormatse creó el objeto, pasamos la cadena "MMM-dd-YYYY"como parámetro. Es esta cadena la que transmite el formato de fecha que finalmente vimos en la salida de la consola.

  • MMM indica que se muestre el nombre del mes, abreviado con tres letras
  • dd indica que se muestre el día del mes
  • YYYY indica que se muestre el año usando cuatro dígitos

Si queremos generar el mes como números, entonces en lugar de MMM, debemos escribir MM, lo que produce el patrón "MM-dd-YYYY". La salida de la pantalla será06-04-2005

Discutiremos esta clase con más detalle más adelante.


8. Date.parsemétodo

La Dateclase puede hacer otra cosa interesante y útil: puede obtener una fecha de una cadena. O, como dicen los programadores, puede analizar una cadena.

Tiene el parse()método especial para esto. El análisis se ve así:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Por cierto, este código se puede escribir de forma más compacta:

Date date = new Date("Jul 06 12:15:00 2019");

Consideraremos el análisis de cadenas con más detalle en otras lecciones.