Introdução ao trabalho com datas e horas em Kotlin
Trabalhar com datas e horas é uma das tarefas mais comuns no desenvolvimento moderno. Seja para registro de eventos, cálculo de prazos, planejamento de tarefas ou exibição de interface do usuário — não é possível prescindir de um bom trabalho com carimbos de data/hora. No Kotlin, que é totalmente compatível com Java, o padrão de facto é o pacote java.time, introduzido no Java 8. Este pacote substituiu os obsoletos java.util.Date e java.util.Calendar, oferecendo uma API thread-safe, imutável e intuitiva.
Neste artigo, abordaremos todos os aspectos essenciais do trabalho com datas e horas em Kotlin: desde a criação de objetos até sua formatação, parsing e realização de operações aritméticas. Você aprenderá a usar LocalDate, LocalTime, LocalDateTime, Instant, Duration e Period com exemplos práticos.
1. Classes principais para trabalhar com datas e horas
O pacote java.time contém várias classes-chave, cada uma resolvendo uma tarefa específica. Vamos analisá-las em detalhes.
1.1 LocalDate — trabalhando com data sem hora
A classe LocalDate representa uma data (ano, mês, dia) sem considerar hora e fuso horário. É ideal para aniversários, eventos de calendário e datas sem vínculo com um momento específico.
import java.time.LocalDate
fun main() { // Data atual val today = LocalDate.now() println("Hoje: $today") // 2025-04-05
// Data específica val newYear = LocalDate.of(2025, 1, 1) println("Ano Novo: $newYear")
// Parsing a partir de string val parsedDate = LocalDate.parse("2025-12-31") println("Data parseada: $parsedDate")}1.2 LocalTime — trabalhando com hora sem data
LocalTime armazena apenas a hora (horas, minutos, segundos, nanossegundos). É útil para armazenar horário de início do dia de trabalho, agendas ou temporizadores.
import java.time.LocalTime
fun main() { // Hora atual val now = LocalTime.now() println("Agora: $now")
// Hora específica val meetingTime = LocalTime.of(14, 30, 0) println("Horário da reunião: $meetingTime")
// Parsing val parsedTime = LocalTime.parse("09:15:30") println("Hora parseada: $parsedTime")}1.3 LocalDateTime — combinação de data e hora
LocalDateTime combina LocalDate e LocalTime. É a classe mais usada para armazenar um momento no tempo sem fuso horário.
import java.time.LocalDateTime
fun main() { // Data e hora atuais val current = LocalDateTime.now() println("Agora: $current")
// Criação a partir de componentes val specific = LocalDateTime.of(2025, 4, 5, 10, 30, 0) println("Momento específico: $specific")
// Combinação de data e hora val date = LocalDate.of(2025, 12, 25) val time = LocalTime.of(18, 0) val christmas = LocalDateTime.of(date, time) println("Natal: $christmas")}1.4 Instant — momento no tempo em UTC
Instant representa um ponto na linha do tempo no formato Unix timestamp (quantidade de segundos e nanossegundos desde 1º de janeiro de 1970). É indispensável para armazenar logs, trabalhar com bancos de dados e trocar dados entre sistemas.
import java.time.Instant
fun main() { // Momento atual em UTC val now = Instant.now() println("Agora (UTC): $now")
// A partir de Unix timestamp val fromEpoch = Instant.ofEpochSecond(1_700_000_000) println("Do timestamp: $fromEpoch")
// Conversão para milissegundos val millis = now.toEpochMilli() println("Milissegundos: $millis")}2. Formatação e parsing de datas e horas
Para converter datas em strings