1. Presentamos la API de fecha y hora

Presentamos la API de fecha y hora

A los creadores de Java no les gustó la situación con las clases Fecha y Calendario. Fueron buenos en su día, pero los tiempos cambian. Y se hizo necesario algo simple, poderoso y confiable. Y con el lanzamiento de Java 8 (15 años después de Calendarsu aparición), se introdujo la API de fecha y hora de Java . Es un conjunto de clases que debería ser capaz de resolver todas las tareas posibles relacionadas con el tiempo.

Había tantas clases que se dividieron en varios paquetes:

El java.timepaquete es el paquete base para Java Date Time API: contiene clases como LocalDate, LocalTime, LocalDateTime, Instant, Periody Duration. Todos los objetos de estas clases son immutable, lo que significa que no se pueden cambiar después de la creación.

El java.time.formatpaquete contiene clases para dar formato a la hora, es decir, convertir horas (y fechas) en cadenas y viceversa. Por ejemplo, contiene la DateTimeFormatterclase versátil, que reemplaza a la SimpleDateFormatclase.

El java.time.zonepaquete contiene clases para trabajar con zonas horarias. Contiene clases como TimeZoney ZonedDateTime. Si está escribiendo código de servidor para clientes ubicados en diferentes partes del mundo, realmente necesitará estas clases.


2. LocalDateclase

La primera y más útil clase de la API de fecha y hora que veremos es la LocalDateclase. Como probablemente pueda adivinar por su nombre, esta clase está diseñada para trabajar con fechas.

Los objetos de esta clase no cambian una vez creados, es decir, la LocalDateclase es inmutable. Pero esta propiedad agrega simplicidad y confiabilidad a la clase. Especialmente si varios hilos (hilos de ejecución) están interactuando con dicho objeto al mismo tiempo.

Para crear un nuevo LocalDateobjeto, debe usar uno de los métodos estáticos. Aquí hay una lista de los principales.

Obtener la fecha actual

Para obtener la fecha actual, debe usar el now()método estático. Esto es mucho más fácil de lo que parece:

LocalDate today = LocalDate.now();

Where todayes una LocalDatevariable y LocalDate.now()es una llamada al now()método estático de la LocalDateclase.

Ejemplo:

Código Salida de consola
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Obtener una fecha en una zona horaria específica

La LocalDateclase también tiene una variación del now(ZoneId)método que le permite obtener la fecha actual en una zona horaria específica.

Para hacer esto, necesitamos otra clase: la ZoneIdclase (java.time.ZoneId). Tiene un of()método que devuelve un ZoneIdobjeto dado el nombre de la zona horaria.

Para determinar la fecha actual en Shanghai, debe escribir el siguiente código:

Código Salida de consola
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Puede encontrar una lista de los nombres de todas las zonas horarias en Internet.


3. Obtener una fecha específica

Para obtener un LocalDateobjeto que represente una fecha específica, debe usar el of()método estático. Todo aquí también es muy simple y claro:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Where datees una LocalDatevariable y es una llamada al método estático de la clase.LocalDate.of()of()LocalDate

Aquí vemos la FEBRUARYconstante de la Monthclase (java.time.Month) que se utiliza para especificar febrero como mes.

También puedes especificar el mes a la antigua, usando un número:

LocalDate date = LocalDate.of(2019, 2, 22);

¿Dos? en lugar de febrero? ¿Significa eso que los meses se están contando una vez más a partir del uno?

Sí, casi 20 años después de la creación de Java, los meses finalmente han dejado de contarse desde cero.

Ejemplo:

Código Salida de consola
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Obtener una fecha por el índice del día.

Hay otra forma interesante de crear una fecha: usando el ofYearDaymétodo, puede obtener una fecha basada solo en el número del año y el índice del día en el año. Aquí está la apariencia general:

LocalDate date = LocalDate.ofYearDay(year, day);

Donde yeares el número del año y dayes el índice del día en el año.

Ejemplo:

Código Salida de consola
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

El día 100 de 2019 es el 10 de abril.

Obtener una fecha de Unix

¿Recuerdas que Datelos objetos siempre almacenaron el tiempo como el número de milisegundos desde el 1 de enero de 1970? Para asegurarse de que los programadores no se pierdan los viejos tiempos, la LocalDateclase obtuvo un ofEpochDay()método que devuelve la fecha calculada a partir del 1 de enero de 1970. Aquí está la apariencia general:

LocalDate date = LocalDate.ofEpochDay(day);

Donde dayes el número de días que han transcurrido desde el 1 de enero de 1970.

Ejemplo:

Código Salida de consola
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Obtener elementos de una fecha

Es imposible cambiar LocalDateobjetos, pero puede obtener elementos individuales de la fecha almacenada. LocalDateLos objetos tienen varios métodos para esto:

Método Descripción
int getYear()
Devuelve el año de una fecha específica
Month getMonth()
Devuelve el mes de la fecha: una de varias constantes
JANUARY, FEBRUARY, ...;
int getMonthValue()
Devuelve el índice del mes de la fecha. Enero == 1.
int getDayOfMonth()
Devuelve el índice del día del mes.
int getDayOfYear()
Devuelve el índice del día desde el comienzo del año.
DayOfWeek getDayOfWeek()
Devuelve el día de la semana: una de varias constantes
MONDAY, TUESDAY, ...;
IsoEra getEra()
Devuelve la era: ya sea BCE(antes de la era actual) y CE(era actual)

Ejemplo:

Código Salida de consola
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Cambiar la fecha en un LocalDateobjeto

La LocalDateclase contiene varios métodos que le permiten trabajar con fechas. La implementación de estos métodos es análoga a los métodos de la Stringclase: no cambian el LocalDateobjeto existente, sino que devuelven uno nuevo con los datos deseados.

Estos son los métodos de la LocalDateclase:

Método Descripción
plusDays(int days)
Agrega un número específico de días a la fecha
plusWeeks(int weeks)
Agrega semanas a la fecha
plusMonths(int months)
Agrega meses a la fecha
plusYears(int years)
Agrega años a la fecha
minusDays(int days)
Resta días de la fecha
minusWeeks(int weeks)
Resta semanas de la fecha
minusMonths(int months)
Resta meses desde la fecha
minusYears(int years)
Resta años a partir de la fecha

Ejemplo:

Código Salida de consola
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Los birthday objectmétodos a los que llamamos no cambian. En cambio, sus métodos devuelven nuevos objetos que contienen los datos deseados.