1. 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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Devuelve el año de una fecha específica |
|
Devuelve el mes de la fecha: una de varias constantesJANUARY, FEBRUARY, ...; |
|
Devuelve el índice del mes de la fecha. Enero == 1. |
|
Devuelve el índice del día del mes. |
|
Devuelve el índice del día desde el comienzo del año. |
|
Devuelve el día de la semana: una de varias constantesMONDAY, TUESDAY, ...; |
|
Devuelve la era: ya sea BCE(antes de la era actual) y CE(era actual) |
Ejemplo:
| Código | Salida de consola |
|---|---|
|
|
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 |
|---|---|
|
Agrega un número específico de días a la fecha |
|
Agrega semanas a la fecha |
|
Agrega meses a la fecha |
|
Agrega años a la fecha |
|
Resta días de la fecha |
|
Resta semanas de la fecha |
|
Resta meses desde la fecha |
|
Resta años a partir de la fecha |
Ejemplo:
| Código | Salida de consola |
|---|---|
|
|
Los birthday objectmétodos a los que llamamos no cambian. En cambio, sus métodos devuelven nuevos objetos que contienen los datos deseados.
GO TO FULL VERSION