2 Fechas en Java 8¶
Introducción¶
Java 8 introduce una nueva API para fechas y horas que es thread-safe, más fácil de leer y más amplia que la API anterior.
Esta API se introduce para cubrir los siguientes inconvenientes de la vieja API de fecha y hora:
java.util.Date
no es thread-safe por lo que los desarrolladores tienen que hacer frente a problemas de concurrencia durante el uso de la fecha. La nueva API de fecha y hora es inmutable y no tiene métodos setter. Al ser inmutables, no necesitan ser clonadas.- Dificultad para manejar zona-horaria.
En java 8 se crea un nuevo paquete para el manejo de fechas, se trata del paquete java.time
. Este paquete es una extensión a las clases java.util.Date
y java.util.Calendar
que vemos un poco limitado para manejo de fechas, horas y localización.
Las clases definidas en este paquete representan los principales conceptos de fecha - hora, incluyendo instantes, fechas, horas, períodos, zonas de tiempo, etc. Están basados en el sistema de calendario ISO, el cual es el calendario mundial de-facto que sigue las reglas del calendario Gregoriano.
Enumerado de día de la semana¶
Existe un enum donde se definen todos los días de la semana. Este enum se llama java.time.DayOfWeek
y contiene algunos métodos interesantes que permiten manipular días hacia adelante, plus(int amount)
y hacia atrás, minus(int amount)
:
DayOfWeek dia = DayOfWeek.MONDAY;
System.out.printf("8 días será: %s%n",dia.plus(8));
System.out.printf("2 días antes fue: %s%n",dia.minus(2));
Además, con el método getDisplayName()
se puede acceder al texto que corresponde a la fecha. Este método recibe dos parámetros:
- TextStyle: Es una enum del paquete
java.time.format
que define diferentes formas de formatear una fecha:TextStyle.FULL
, la descripción completa, por ejemplo Monday.TextStyle.NARROW
, la letra que representa ese día, M.TextStyle.SHORT
, la abreviación del día, Mon.
-
Locale: Es una clase que trabaja con la localización, de está forma ponemos obtener Monday si estamos en UK, o Lunes si estamos en España. Para crear una instancia del objeto
Locale
, se puede hacer de dos formas:- Usando los atributos estáticos que representas los más utilizados, por ejemplo:
Locale.ENGLISH
. - Usando el método estático
of()
, que recibe el código de lenguaje, por ejemplo, si es para español. Dicho constructor esta sobrecargado para recibir el código del país, ES para España. También tiene una tercera versión que además de recibir los dos parámetros indicados antes, recibe el código de la variante, por ejemplo ca, para el Catalán.
Java 19
En versiones anterior a Java 19, el método estático
of()
, no existía. En su lugar se usan los constructores (que tienen la misma firma que este método), que están deprecated en esta versión. - Usando los atributos estáticos que representas los más utilizados, por ejemplo:
Veamos un ejemplo de como mostrar todos los días de la semana en español:
public class EnumDays {
public void show(){
Locale locale = Locale.of("es", "ES");
for (DayOfWeek day : DayOfWeek.values()) {
System.out.printf("Día completo: %s\n", day.getDisplayName(TextStyle.FULL, locale));
System.out.printf("Letra del día: %s\n", day.getDisplayName(TextStyle.NARROW, locale));
System.out.printf("Día abreviado: %s\n", day.getDisplayName(TextStyle.SHORT, locale));
}
}
public static void main(String[] args) {
new EnumDays().show();
}
}
Día completo: lunes
Letra del día: L
Día abreviado: lun
Día completo: martes
Letra del día: M
Día abreviado: mar
Día completo: miércoles
Letra del día: X
Día abreviado: mié
Día completo: jueves
Letra del día: J
Día abreviado: jue
Día completo: viernes
Letra del día: V
Día abreviado: vie
Día completo: sábado
Letra del día: S
Día abreviado: sáb
Día completo: domingo
Letra del día: D
Día abreviado: dom
Enumerado de mes del año¶
En está API, también se añadió el enum java.time.Month
que representa los meses del año. Tiene los mismos métodos que los días de la semana:
public class EnumMonths {
public void show(){
Locale locale = Locale.of("es", "ES");
for (Month day : Month.values()) {
System.out.printf("Mes completo: %s\n", day.getDisplayName(TextStyle.FULL, locale));
System.out.printf("Letra del mes: %s\n", day.getDisplayName(TextStyle.NARROW, locale));
System.out.printf("Mes abreviado: %s\n", day.getDisplayName(TextStyle.SHORT, locale));
}
}
public static void main(String[] args) {
new EnumMonths().show();
}
}