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

Apr 12, 2025 - 05:55
 0

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