Saltar al contenido principal

Manejo de fechas

Hasta antes de la llegada de Java 8, el manejo de fechas era bastante engorroso y muchas veces terminaba realizándose con bibliotecas externas. A partir de esa versión, se incorporan dos clases completamente nuevas, que por ser nativas terminan por reemplazar a los otras opciones existentes.

Como hemos dicho en alguna otra oportunidad, en Kotlin se puede usar cualquier clase de Java, y por eso es que Kotlin no incluye una API propia para manejar fechas.

La clases en cuestión son: LocalDate, con la cual podemos representar una fecha, y LocalDateTime, con la cual podemos además establecer la hora.

Ejemplo práctico#

Una pequeña muestra de qué puede hacerse con LocalDate y LocalDateTime:

Creación#

import java.time.LocalDateimport java.time.LocalDateTime // Instancia de LocalDate con los valores de la fecha actual del sistema.val fechaActual = LocalDate.now()>>> 10/22/2021 // Instancia de LocalDate con valores que recibe por parámetro.// Notar que el orden es siempre de mayor a menor: año, mes, día.val renunciaDeLaRua = LocalDate.of(2001, 12, 20)>>> 2001-12-20 // Se agregan los valores para hora, minutos y segundos (todos cero en este caso).val inicioAislamientoArgentina = LocalDateTime.of(2020, 3, 20, 0, 0, 0)>>> 2020-03-20T00:00:00

Comparación con otras fechas#

// Devuelve un booleano indicando si la fecha es posterior// a la que viene por parámetro.fechaActual.isAfter(renunciaDeLaRua)>>> true
// En este caso, como `inicioAislamientoArgentina` es LocalDateTime,// hay que convertirlo a LocalDate para poder compararlo.fechaActual.isBefore(inicioAislamientoArgentina.toLocalDate())>>> false

Manipulación#

Ojo al piojo

Todos estos métodos devuelven un nuevo objeto que representa al resultado, y nunca cambian al original (mutaciones controladas, creo que eso lo leí en algún lado... 🤔).

// Este método devuelve *una nueva fecha*, con doce días más.// Notar que hace lo que se espera que haga: actualiza mes y año si es necesario.renunciaDeLaRua.plusDays(12)>>> 2002-01-01
// Para los LocalDateTime, también hay métodos para manipular la hora.inicioAislamientoArgentina.plusMinutes(20)>>> 2020-03-20T00:20:00

Transformar un string en fecha#

Tanto LocalDate como LocalDateTime entienden el método parse, que transforma un string al objeto correspondiente. Obviamente, para que esto funcione el string tiene que tener algún formato válido.

Por defecto, se asume que el string viene en formato ISO 8601, pero eso se puede configurar pasando un segundo parámetro.

Veamos algunos ejemplos:

// Transformar una fecha en formato ISOLocalDate.parse("2022-08-09")>> 2022-08-09
// Transformar una fecha y hora en formato ISOLocalDateTime.parse("2022-08-09T14:19:40")>> 2022-08-09T14:19:40
// Transformar una fecha y hora, con milisegundos, en formato ISOLocalDateTime.parse("2022-08-09T14:19:40.366")>> 2022-08-09T14:19:40.366
// Transformar una fecha y hora en formato ISO con zona horaria UTC (Z)LocalDateTime.parse("2022-08-09T14:19:40Z", DateTimeFormatter.ISO_OFFSET_DATE_TIME)>> 2022-08-09T14:19:40
// Transformar una fecha y hora en formato ISO con zona horaria -3LocalDateTime.parse("2022-08-09T14:19:40+03:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME)>> 2022-08-09T14:19:40

Mostrar una fecha como string#

Para el caso inverso al anterior, tanto LocalDate como LocalDateTime ofrecen un método format, que convierte la fecha en un string. En general, esto resulta útil cuando queremos mostrarle información a un usuario.

Veamos algunos ejemplos:

// Si omitimos los segundos, los toma como 0val nacimientoJuana = LocalDateTime.of(1987, 3, 4, 12, 34)
// Fecha y horanacimientoJuana.format(DateTimeFormatter.ISO_DATE_TIME)"1987-03-04T12:34:00"
// Solo la fechanacimientoJuana.format(DateTimeFormatter.ISO_DATE)"1987-03-04"
// Solo la horanacimientoJuana.format(DateTimeFormatter.ISO_TIME)"12:34:00"

Documentación oficial#

Con lo de arriba debería ser suficiente para resolver la mayoría de los ejercicios de nuestros cursos.

Te dejamos la documentación oficial de LocalDateTime y la de LocalDate por si querés chusmear algo más.