Trabalho com datas em Java: bibliotecas e ferramentas
Trabalhar com datas e horas é uma das tarefas principais em qualquer aplicação. Em Java, por muito tempo, as classes padrão java.util.Date e java.util.Calendar foram criticadas devido à inconveniência, mutabilidade e suporte deficiente a fusos horários. No entanto, com o lançamento do Java 8, a situação mudou drasticamente. Neste artigo, vamos analisar as principais bibliotecas e ferramentas para trabalhar com datas em Java, que ajudarão você a escrever código limpo e confiável.
1. Biblioteca padrão java.time (Java 8+)
A partir do Java 8, os desenvolvedores têm acesso ao poderoso pacote java.time, baseado no padrão ISO-8601. Esta é a forma recomendada de trabalhar com datas e horas. Principais classes:
LocalDate— data sem hora (ano, mês, dia).LocalTime— hora sem data (horas, minutos, segundos, nanossegundos).LocalDateTime— combinação de data e hora.ZonedDateTime— data e hora considerando o fuso horário.Instant— momento em UTC (para tempo de máquina).DurationePeriod— para trabalhar com intervalos.
Exemplo: criação e formatação de data
import java.time.LocalDate;import java.time.format.DateTimeFormatter;
public class DateExample { public static void main(String[] args) { // Data atual LocalDate today = LocalDate.now(); System.out.println("Hoje: " + today);
// Criação de uma data específica LocalDate birthDate = LocalDate.of(1990, 5, 15); System.out.println("Data de nascimento: " + birthDate);
// Formatação DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); String formatted = birthDate.format(formatter); System.out.println("Data formatada: " + formatted);
// Parsing de string String dateStr = "2023-12-31"; LocalDate parsedDate = LocalDate.parse(dateStr); System.out.println("Parseado: " + parsedDate); }}Exemplo: cálculo da diferença entre datas
import java.time.LocalDate;import java.time.Period;import java.time.temporal.ChronoUnit;
public class DateDifference { public static void main(String[] args) { LocalDate start = LocalDate.of(2020, 1, 1); LocalDate end = LocalDate.of(2024, 3, 15);
Period period = Period.between(start, end); System.out.println("Diferença: " + period.getYears() + " anos, " + period.getMonths() + " meses, " + period.getDays() + " dias");
long daysBetween = ChronoUnit.DAYS.between(start, end); System.out.println("Total de dias: " + daysBetween); }}2. Joda-Time (para versões antigas do Java)
Antes do surgimento do java.time, o padrão de facto era a biblioteca Joda-Time. Ela fornecia classes imutáveis convenientes e suporte a fusos horários. Se você trabalha com Java 7 ou inferior, Joda-Time é uma excelente escolha.
Adição (Maven):
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.12.7</version></dependency>Exemplo: trabalho com Joda-Time
import org.joda.time.DateTime;import org.joda.time.Days;import org.joda.time.format.DateTimeFormat;import org.joda.time.format.DateTimeFormatter;
public class JodaExample { public static void main(String[] args) { // Data e hora atuais DateTime now = new DateTime(); System.out.println("Agora: " + now);
// Criação de data DateTime specificDate =