Trabalhando com datas e horas em Java: guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
```html

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

```

Blogs

Book Recommendations