✅ 1. Calendar permite datas inválidas silenciosamente
Código exemplo:
Calendar instante = Calendar.getInstance();
instante.set(2014, Calendar.FEBRUARY, 30);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
System.out.println(dateFormat.format(instante.getTime()));
Saída:
02/03/14
Explicação:
- Mesmo que 30 de fevereiro não exista, o Calendar ajusta automaticamente a data para 2 de março, sem avisar o erro.
- Esse comportamento pode levar a bugs difíceis de detectar.
❌ 2. A nova API (java.time) não permite datas inválidas
Código exemplo:
LocalDate.of(2014, Month.FEBRUARY, 30);
Saída (exceção):
Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 30'
Explicação:
- A nova API do pacote java.time (Java 8+) é imutável e mais segura.
- Tenta criar uma data inválida? Ela lança exceção imediatamente.
❌ 3. Também falha com horários inválidos
Código exemplo:
LocalDateTime horaInvalida = LocalDate.now().atTime(25, 0);
Saída (exceção):
java.time.DateTimeException: Invalid value for HourOfDay (valid values 0 - 23): 25
Explicação:
- Tentativa de usar uma hora inválida (25h).
- A nova API garante validade de tempo, lançando DateTimeException.
⚠️ 4. Problema histórico com Joda-Time (DateMidnight)
- Nota da documentação do Joda-Time:
- O método toDateMidnight pode lançar exceção se a data cair no início do horário de verão.
Exemplo: quando não existe "meia-noite" naquele dia.
Recomendação da própria equipe:
- Evitar DateMidnight.
- Usar toDateTimeAtStartOfDay() como alternativa.
Curiosidade:
- O próprio criador do Joda-Time, Stephen Colebourne, disse que não há boas razões para usar DateMidnight.
- Essa classe não foi incluída na nova API de datas do Java 8.
✅ Conclusão
- Calendar: Comportamento tolerante, ajusta automaticamente datas inválidas → perigoso.
- java.time (Java 8+): Mais segura, lança exceção para qualquer valor inválido.
- Use sempre a nova API de datas (LocalDate, LocalDateTime, etc.) para evitar bugs silenciosos e ter maior controle e segurança.