Introdução ao trabalho com datas e horas em Kotlin
Trabalhar com datas e horas é uma das tarefas principais no desenvolvimento de qualquer aplicação. Seja para registro de eventos, cálculo de prazos, exibição de calendário ou trabalho com timestamps — não é possível prescindir de um conjunto de ferramentas confiável. No ecossistema Kotlin, para esses fins, é utilizada a poderosa biblioteca java.time, que substituiu as obsoletas java.util.Date e java.util.Calendar. Graças à compatibilidade total com Java, o Kotlin permite usar todos os recursos do java.time diretamente, além de adicionar extensões convenientes e açúcar sintático.
Neste artigo, vamos detalhar como criar, formatar, fazer parsing e converter datas e horas em Kotlin. Você conhecerá as principais classes, como LocalDate, LocalTime, LocalDateTime, ZonedDateTime e Instant, e também aprenderá a trabalhar com períodos e durações. Todos os exemplos de código são escritos em Kotlin puro e estão prontos para uso.
Principais classes para trabalhar com datas e horas
A biblioteca java.time oferece várias classes principais, cada uma resolvendo uma tarefa específica. Vamos examiná-las em detalhes.
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 tarefas onde a hora não importa.
import java.time.LocalDate
fun main() { // Data atual val today = LocalDate.now() println("Hoje: $today")
// Data específica val specificDate = LocalDate.of(2024, 12, 25) println("Natal: $specificDate")
// Parsing a partir de string val parsedDate = LocalDate.parse("2024-12-25") println("Parseado: $parsedDate")}LocalTime — trabalhando com hora sem data
LocalTime armazena apenas a hora (horas, minutos, segundos, nanossegundos). É usado para horários, temporizadores e timestamps sem vínculo com a data.
import java.time.LocalTime
fun main() { // Hora atual val now = LocalTime.now() println("Agora: $now")
// Hora específica val lunchTime = LocalTime.of(13, 30) println("Almoço às: $lunchTime")
// Parsing val parsedTime = LocalTime.parse("15:45:30") println("Parseado: $parsedTime")}LocalDateTime — combinação de data e hora
LocalDateTime combina LocalDate e LocalTime. É a classe mais usada para armazenar um momento no tempo sem considerar o fuso horário.
import java.time.LocalDateTimeimport java.time.LocalDateimport java.time.LocalTime
fun main() { // Momento atual val now = LocalDateTime.now() println("Agora: $now")
// A partir de componentes separados val date = LocalDate.of(2024, 12, 25) val time = LocalTime.of(10, 0) val christmasMorning = LocalDateTime.of(date, time) println("Manhã de Natal: $christmasMorning")
// Método combinado val newYear = LocalDateTime.of(2025, 1, 1, 0, 0) println("Ano Novo: $newYear")}Formatação e parsing de datas
Para converter datas em strings e vice-versa, é usada a classe DateTimeFormatter. Ela suporta vários formatos predefinidos e também permite criar padrões personalizados.
Formatando data em string
import java.time.LocalDateTimeimport java.time.format.DateTimeFormatter
fun main() { val now = LocalDateTime.now()
// Formato ISO padrão val isoFormat = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) println("ISO: $isoFormat")
// Formato personalizado val customFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss") va