Introdução ao trabalho com datas e horas em Java
Trabalhar com datas e horas é uma das tarefas mais comuns no desenvolvimento de aplicações. O Java fornece ferramentas poderosas para esse fim. Durante muito tempo, a classe principal era java.util.Date, mas ela tinha sérias desvantagens: mutabilidade, confusão com meses (começando em 0) e falta de suporte a fusos horários. Com o lançamento do Java 8, a situação mudou drasticamente — surgiu a nova Date/Time API (pacote java.time), que é thread-safe, imutável e intuitiva. Neste artigo, abordaremos ambas as abordagens, mas o foco principal será na API moderna.
1. Legacy API: Date e Calendar
Embora não seja recomendado usar classes antigas em código novo, você pode encontrá-las em projetos legados. Vamos analisar os principais pontos.
Classe Date
A classe java.util.Date representa um momento específico no tempo com precisão de milissegundos. Ela possui muitos métodos obsoletos.
import java.util.Date;
public class LegacyDateExample {
public static void main(String[] args) {
// Data e hora atuais
Date now = new Date();
System.out.println("Data atual: " + now);
// Data a partir de milissegundos (desde 1 de janeiro de 1970)
Date specificDate = new Date(1000000000000L);
System.out.println("Data por timestamp: " + specificDate);
// Comparação de datas
Date earlier = new Date(0);
boolean isBefore = earlier.before(now); // true
System.out.println("É anterior? " + isBefore);
}
}
Classe Calendar
java.util.Calendar é uma ferramenta mais flexível, porém verbosa. Permite manipular campos de data.
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
// Definindo uma data específica: 25 de dezembro de 2024
cal.set(2024, Calendar.DECEMBER, 25, 10, 30, 0);
System.out.println("Data: " + cal.getTime());
// Adicionando 2 semanas
cal.add(Calendar.WEEK_OF_YEAR, 2);
System.out.println("Daqui a 2 semanas: " + cal.getTime());
// Obtendo campos individuais
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH) + 1; // +1, pois janeiro = 0
System.out.println("Dia: " + dayOfMonth + ", Mês: " + month);
}
}
Desvantagens: mutabilidade (o método add altera o objeto original), complexidade de formatação, confusão com fusos horários.
2. Date/Time API Moderna (Java 8+)
O pacote java.time inclui classes-chave: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant e outras. Todas são imutáveis e thread-safe.
LocalDate — trabalhando com data
Armazena data sem hora e fuso horário (ano, mês, dia).
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 newYear = LocalDate.of(2025, Month.JANUARY, 1);
System.out.println("Ano Novo: " + newYear);
// Aritmética de datas
LocalDate nextWeek = today.plusWeeks(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Daqui a uma semana: " + nextWeek);
System.out.println("Mês passado: " + lastMonth);
// Comparação
boolean isAfter = today.isAfter(newYear); // false
System.out.println("Hoje é depois do Ano Novo? " + isAfter);
}
}
LocalTime — trabalhando com hora
Armazena hora
```