✅ 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.

✅ 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.