DEV Community

Cover image for Dicas de Java #1 - muito cuidado com SimpleDateFormat e seu aspecto "lenient"!
Henrique Lobo Weissmann (Kico) for itexto

Posted on

3 1

Dicas de Java #1 - muito cuidado com SimpleDateFormat e seu aspecto "lenient"!

Em Java (e Groovy) é muito comum validarmos uma data digitada usando a classe SimpleDateFormat escrevendo código muito parecido com o exposto a seguir:

String dataInvalida = "45/42/2017"; // mês 42???</code>
SimpleDateFormat formatoData = new 
SimpleDateFormat("dd/MM/yyyy");
try {
  Date dataParseada = formatoData.parse(dataInvalida);
// se parseou, data válida!
  } catch (ParseException ex) {
// data inválida! Não parseou
 }
Enter fullscreen mode Exit fullscreen mode

Por mais estranho que possa parecer, a data acima será considerada válida por SimpleDateFormat. Isto se deve ao aspecto "lenient" de sua implementação: um atributo do tipo boolean cujo valor default é true.

Se está definido como verdadeiro, SimpleDateFormat irá executar eurísticas internas para descobrir qual a data a partir da loucura que você forneceu. No exemplo acima a data encontrada será 15/7/2020 (experimente com o código acima).

Como resolver então? Simples: chamando o método setLenient e passando para este o valor false, tal como no exemplo abaixo:

String dataInvalida = "45/42/2017"; // mês 42???
SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
formatoData.setLenient(false); // simples!
try {
   Date dataParseada = formatoData.parse(dataInvalida);
   // se parseou, data válida (de verdade)!
} catch (ParseException ex) {
   // data inválida! Não parseou. Bobagem enviada.
}

Problema resolvido, e não, infelizmente você não descobriu um bug na classe SimpleDateFormat. :)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay