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.
¿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 |
|---|---|
|
|
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:
- El año debe contarse desde 1900.
- Los meses se numeran desde cero.
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Devuelve el año de la fecha relativo a 1900. |
|
Devuelve el mes de la fecha (los meses se numeran desde cero) |
|
Devuelve el día del mes. |
|
Devuelve el día de la semana. |
|
Devuelve las horas |
|
Devuelve los minutos |
|
Devuelve los segundos |
Ejemplo:
| Código | Salida de consola | Nota |
|---|---|---|
|
|
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 |
|---|
|
| Salida de consola |
|
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.
GO TO FULL VERSION