Introducción al trabajo con fechas y horas en Kotlin
Trabajar con fechas y horas es una de las tareas clave en el desarrollo de cualquier aplicación. Ya sea para el registro de eventos, el cálculo de plazos, la visualización de un calendario o el trabajo con marcas de tiempo, no se puede prescindir de un conjunto de herramientas fiable. En el ecosistema de Kotlin, para estos fines se utiliza la potente biblioteca java.time, que reemplazó a las obsoletas java.util.Date y java.util.Calendar. Gracias a la compatibilidad total con Java, Kotlin permite usar todas las funcionalidades de java.time directamente, además de añadir extensiones convenientes y azúcar sintáctico.
En este artículo, analizaremos en detalle cómo crear, formatear, analizar (parsear) y convertir fechas y horas en Kotlin. Conocerás las clases clave, como LocalDate, LocalTime, LocalDateTime, ZonedDateTime e Instant, y también aprenderás a trabajar con periodos y duraciones. Todos los ejemplos de código están escritos en Kotlin puro y listos para usar.
Clases principales para trabajar con fechas y horas
La biblioteca java.time ofrece varias clases clave, cada una de las cuales resuelve una tarea específica. Veámoslas en detalle.
LocalDate — trabajar con fecha sin hora
La clase LocalDate representa una fecha (año, mes, día) sin tener en cuenta la hora ni la zona horaria. Es ideal para cumpleaños, eventos de calendario y tareas donde la hora no importa.
import java.time.LocalDate
fun main() {
// Fecha actual
val today = LocalDate.now()
println("Hoy: $today")
// Fecha específica
val specificDate = LocalDate.of(2024, 12, 25)
println("Navidad: $specificDate")
// Parseo desde cadena
val parsedDate = LocalDate.parse("2024-12-25")
println("Parseado: $parsedDate")
}
LocalTime — trabajar con hora sin fecha
LocalTime almacena solo la hora (horas, minutos, segundos, nanosegundos). Se utiliza para horarios, temporizadores y marcas de tiempo sin vinculación a una fecha.
import java.time.LocalTime
fun main() {
// Hora actual
val now = LocalTime.now()
println("Ahora: $now")
// Hora específica
val lunchTime = LocalTime.of(13, 30)
println("Almuerzo a las: $lunchTime")
// Parseo
val parsedTime = LocalTime.parse("15:45:30")
println("Parseado: $parsedTime")
}
LocalDateTime — combinación de fecha y hora
LocalDateTime combina LocalDate y LocalTime. Es la clase más utilizada para almacenar un instante de tiempo sin considerar la zona horaria.
import java.time.LocalDateTime
import java.time.LocalDate
import java.time.LocalTime
fun main() {
// Momento actual
val now = LocalDateTime.now()
println("Ahora: $now")
// A partir de componentes individuales
val date = LocalDate.of(2024, 12, 25)
val time = LocalTime.of(10, 0)
val christmasMorning = LocalDateTime.of(date, time)
println("Mañana de Navidad: $christmasMorning")
// Método combinado
val newYear = LocalDateTime.of(2025, 1, 1, 0, 0)
println("Año Nuevo: $newYear")
}
Formateo y parseo de fechas
Para convertir fechas a cadenas y viceversa se utiliza la clase DateTimeFormatter. Admite muchos formatos predefinidos y también permite crear patrones personalizados.
Formateo de fecha a cadena
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
fun main() {
val now = LocalDateTime.now()
// Formato ISO estándar
val isoFormat = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
println("ISO: $isoFormat")
// Formato personalizado
val customFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")
val
```