Introdução ao trabalho com datas e horas em Java
Trabalhar com datas e horas é uma das tarefas essenciais no desenvolvimento de qualquer aplicação. Seja para registro de eventos, cálculo de prazos de entrega, gerenciamento de horários ou análise de dados — é fundamental entender como o Java gerencia objetos temporais. Neste artigo, abordaremos todos os aspectos principais: desde a API antiga (Date e Calendar) até o pacote moderno java.time (Java 8+). Você aprenderá a criar, formatar, comparar e calcular a diferença entre datas.
1. API antiga: Date e Calendar
Antes do Java 8, as principais classes para trabalhar com datas eram java.util.Date e java.util.Calendar. Elas ainda são encontradas em código legado, por isso é importante entender suas funcionalidades básicas e limitações.
1.1 Classe Date
Date representa um momento específico no tempo com precisão de milissegundos. No entanto, possui muitas desvantagens: é mutável (inseguro em aplicações multithread) e tem suporte limitado à internacionalização.
import java.util.Date;
public class DateExample { public static void main(String[] args) { // Data e hora atuais Date now = new Date(); System.out.println("Data atual: " + now);
// Forma obsoleta de obter o ano (1900 + ...) int year = now.getYear() + 1900; System.out.println("Ano: " + year); }}1.2 Classe Calendar
Calendar é uma classe mais flexível, porém complexa. Permite manipular componentes individuais da data (ano, mês, dia).
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); System.out.println("Hora atual: " + cal.getTime());
// Definir uma data específica cal.set(2025, Calendar.MARCH, 15); System.out.println("Data definida: " + cal.getTime());
// Adicionar 7 dias cal.add(Calendar.DAY_OF_MONTH, 7); System.out.println("Daqui a uma semana: " + cal.getTime()); }}Desvantagens: numeração dos meses começando em 0 (janeiro = 0), mutabilidade, falta de formatação simples.
2. Nova API: java.time (Java 8+)
A partir do Java 8, o pacote java.time foi adicionado à biblioteca padrão, baseado nas ideias da biblioteca Joda-Time. Ele consiste em classes imutáveis, tornando o código seguro e previsível.
2.1 LocalDate — apenas data
LocalDate representa uma data sem hora (ano, mês, dia). Ideal para aniversários, calendários.
import java.time.LocalDate;import java.time.Month;
public class LocalDateExample { public static void main(String[] args) { // Data atual LocalDate today = LocalDate.now(); System.out.println("Hoje: " + today);
// Data específica LocalDate specificDate = LocalDate.of(2025, Month.DECEMBER, 31); System.out.println("Ano Novo: " + specificDate);
// Adicionar/subtrair dias LocalDate nextWeek = today.plusDays(7); System.out.println("Daqui a uma semana: " + nextWeek); }}2.2 LocalTime — apenas hora
LocalTime armazena a hora (horas, minutos, segundos, nanossegundos) sem vínculo com a data.
import java.time.LocalTime;
public class LocalTimeExample { public static void main(String[] args) { LocalTime now = LocalTime.now(); System.out.println("Hora atual: " + now);
LocalTime meeting = LocalTime.of(14, 30); System.out.println("Reunião às: " + meeting);
// Comparação de horas if (now.isAfter(meeting)) { System.out.println("A reunião já passou"); } }}<