Validar data com PHP

Quando pensamos em validar datas com PHP, a primeira solução que surge é utilizando Expressões Regulares. Neste post irei trabalhar com datas no formato dd/mm/yyyy, formato usado em Angola, Brasil e Portugal.

Imaginemos que temos a seguinte data a ser validada: 05/10/2017. Usando expressões regulares teríamos algo como mostra o código abaixo:

Como podemos ver, o resultado apresentado na tela será “Data Válida”. E se mudarmos a data para algo como “2017/10/05” o resultado será “Data Inválida”, isto porque a data em questão não se encontra no formato pretendido (dd/mm/yyyy).

Aparentemente o nosso código está a funcionar perfeitamente. E é tudo que precisamos para validar as datas no nosso sistema. Mas e se eu te dizer que este códido possui um problema? quer ver ?

Mude a data a validar para algo como “31/11/2017”. Executando o código o resultado obviamente será “Data Válida”. Aí podes perguntar – mas não é exactamente isso que queremos? – Não. Não é isso. A data fornecida, apesar de estar num formato válido, não se trata de uma data válida (Calendário Gregoriano). Está com dúvidas? consulte o seu calendário e verá que a data “31/11/2017” não existe. O mês de Novembro do ano 2017 termina no dia 30 e não no dia 31. Logo, a data é inválida. Como resolver isso?

Criando nossa própria função

Para resolver o problema acima apresentado, vamos criar nossa própria função para validar a nossa data. Usando o código abaixo o nosso problema estará resolvido:

No código acima, a partir da linha 5, criamos a nossa função (validarData($data)) que recebe como argumento a data no formato “dd/mm/yyyy”. Na linha 6, usamos a função do PHP explode para separar a string e criar um array com 3 valores. Ou seja, com a data 30/11/2017 teremos como resultado o array: [30, 11, 2017].

Na linha 8 primeiro garantimos que o nosso array contém exactamente 3 valores e de seguida, usamos a função checkdate do PHP para validar a data gregoriana. Veja que esta função recebe três argumentos: mês, dia e ano respectivamente. Por isso a necessidade de separar a string criando um array como fizemos na linha 6. Caso as duas condições sejam satisfeitas, a função irá retornar o valor booleano Verdadeiro (true), caso contrário irá retornar o valor booleano Falso (false).

Usando a função crianda para validar a data “30/11/2017” como mostra o exemplo acima, o resultado será: “Data Válida”. Mas se mudarmos a data para “31/11/2017” ou para “30/02/2017”, o resultado será “Data Inválida”. Ou seja, agora o nosso código funciona como deve ser.

A solução apresentada acima, apesar de funcionar, deixa-nos preso a um único formato. E sites/sistemas multi-idioma, por exemplo, na medida que se muda o idioma, há a necessidade de mudar o formato da data. Logo, surge a necessidade de prepararmos o nosso sistema afim de saber lidar com vários formatos de data. Na documentação oficial do PHP, uma sugestão muito boa foi deixada que permite resolver tal desafio, como apresento a seguir:

O que muda é que agora a nossa função, além da data, recebe o formato da data a ser validado. Isso nos permite não só validar datas como também podemos validar Horas e/ou Data e Horas como “2017/10/05 02:33:00”. Também deixamos de usar a função “chechdate”, o “$d->format($formato)” só retorna a data se a mesma for válida, caso contrário restorna uma data inválida, diferente da data que passamos como argumento.

É isso aí, qualquer dúvida, crítica ou sugestão, deixe nos comentários.

Abs e até a próxima!

,,,,