Introdução
Trabalhar com datas e horas é uma das tarefas mais comuns no desenvolvimento moderno. Seja para registro de eventos, cálculo de prazos, exibição de calendário ou internacionalização de aplicações, o desenvolvedor Kotlin precisa saber processar corretamente dados temporais. Neste artigo, vamos detalhar como trabalhar com datas e horas em Kotlin, usando a API moderna java.time, disponível desde o Java 8 e totalmente compatível com Kotlin. Você aprenderá sobre as principais classes, formatação, parsing, trabalho com fusos horários e exemplos práticos que ajudarão você a escrever código limpo e confiável.
Principais classes para trabalhar com datas e horas
Em Kotlin, assim como em Java, o trabalho principal com datas e horas é baseado no pacote java.time. Este pacote foi criado para substituir os obsoletos java.util.Date e java.util.Calendar. Ele oferece classes imutáveis (immutable) e thread-safe. Vamos analisar as mais importantes.
LocalDate — data sem hora
A classe LocalDate representa uma data (ano, mês, dia) sem considerar hora e fuso horário. Ideal para aniversários, feriados ou datas de eventos.
import java.time.LocalDate
fun main() { // Data atual val today: LocalDate = LocalDate.now() println("Hoje: $today") // Saída: 2025-04-11
// Data específica val specificDate: LocalDate = LocalDate.of(2025, 12, 25) println("Natal: $specificDate")
// Adicionar dias val nextWeek: LocalDate = today.plusDays(7) println("Daqui a uma semana: $nextWeek")}LocalTime — hora sem data
Se você precisa apenas da hora (horas, minutos, segundos, nanossegundos), use LocalTime.
import java.time.LocalTime
fun main() { val now: LocalTime = LocalTime.now() println("Hora atual: $now")
val meetingTime: LocalTime = LocalTime.of(14, 30) println("Reunião às: $meetingTime")
val oneHourLater: LocalTime = now.plusHours(1) println("Daqui a uma hora: $oneHourLater")}LocalDateTime — data e hora juntas
Esta é uma combinação de LocalDate e LocalTime. A classe mais popular para armazenar um momento no tempo sem vínculo com fuso horário.
import java.time.LocalDateTime
fun main() { val currentDateTime: LocalDateTime = LocalDateTime.now() println("Agora: $currentDateTime")
val newYear: LocalDateTime = LocalDateTime.of(2026, 1, 1, 0, 0) println("Ano Novo: $newYear")}ZonedDateTime e Instant — trabalho com fusos horários
ZonedDateTime adiciona a LocalDateTime informações sobre o fuso horário (ZoneId). Instant representa um momento no tempo em UTC (hora da máquina).
import java.time.ZonedDateTimeimport java.time.ZoneIdimport java.time.Instant
fun main() { // Hora em um fuso horário específico val moscowTime: ZonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow")) println("Hora em Moscou: $moscowTime")
// Momento atual em UTC val instant: Instant = Instant.now() println("Timestamp UTC: $instant")}Formatação e parsing de datas
Para converter data em string (formatação) e string em data (parsing), usa-se a classe DateTimeFormatter. Ela permite definir qualquer padrão.
Formatação de data em string
import java.time.LocalDateimport java.time.format.DateTimeFormatter
fun main() { val date = LocalDate.now() val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") val formattedDate: String = date.format(formatter) println("Data formatada: $formattedDate") // Saída: 11.04.2025
// Outros exemplos de padrões val formatter2 = DateTimeFormat