DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

📆 10.5 Datas inválidas

✅ 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()));

Enter fullscreen mode Exit fullscreen mode

SaĂ­da:

02/03/14
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

Saída (exceção):

Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 30'
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

Saída (exceção):

java.time.DateTimeException: Invalid value for HourOfDay (valid values 0 - 23): 25
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)