Validar Data no PHP: Como usar a função checkdate()

Como Validar Datas com Segurança no PHP usando a Função checkdate()

O Perigo dos Dados Sujos em Sistemas Comerciais

Durante a sua carreira como Desenvolvedor Web Full-Stack, a validação de dados de entrada será uma constante em sua rotina. Quando desenvolvemos e-commerces, sistemas bancários, motores de agendamento ou portais corporativos sob regras estritas da LGPD, garantir a integridade lúdica do banco de dados contra payloads corrompidos é prioridade número um.

Imagine o seguinte cenário de produção: um usuário mal-intencionado ou um bot automatizado tenta se cadastrar na sua plataforma informando que nasceu no dia 30 de fevereiro. Como sabemos, fevereiro nunca possui 30 dias. Se o seu script back-end aceitar esse dado cru sem tratamento, você gerará anomalias graves nos cálculos de faturamento, consultas sql incoerentes e brechas de estouro de pilha na memória do servidor.

Para resolver isso de maneira nativa, rápida e altamente otimizada, o ecossistema do engine possui uma função predefinida perfeita: a checkdate().

Como funciona a função checkdate() no PHP?
A função checkdate() valida uma data do calendário gregoriano recebendo três parâmetros numéricos inteiros obrigatórios. Ela retorna true se a combinação do mês, dia e ano formar uma data válida que realmente existe no calendário, e false se a data for impossível ou inexistente.

Verificando Datas na Prática: Sintaxe da Função checkdate()

A assinatura oficial estruturada na engine possui um detalhe crucial que confunde muitos programadores juniores na hora do desenvolvimento de formulários locais. Veja a definição de tipos:

bool checkdate(int $month, int $day, int $year)

⚠️ Atenção Sênior: Observe rigorosamente a ordem dos argumentos! Diferente do padrão brasileiro (Dia/Mês/Ano), a função adota a ordem internacional americana: primeiro o Mês, depois o Dia e por último o Ano. Inverter esses fatores fará com que o algoritmo valide o seu dia como mês, quebrando toda a lógica de negócio da aplicação.

Regras de Validação Internas da Engine:

  • Ano ($year): Deve estar obrigatoriamente entre 1 e 32767.
  • Mês ($month): Deve estar entre 1 e 12 inclusive.
  • Dia ($day): É verificado dinamicamente com base no mês e ano informados, calculando automaticamente meses de 30 ou 31 dias.
  • Anos Bissextos: A função calcula instantaneamente se o ano é bissexto para validar se o dia 29 de fevereiro existiu naquele ciclo específico!

Exemplos Rápidos de Retorno:

checkdate(5, 5, 1988) ➡️ Retorna true (Maio possui dia 5).
checkdate(2, 29, 2019) ➡️ Retorna false (2019 não foi bissexto, fevereiro teve 28 dias).
checkdate(2, 29, 2020) ➡️ Retorna true (2020 foi bissexto, data válida).

Escreva Códigos Limpos e Sem Anúncios Atrapalhando 🎓

"Estava cheio de dúvidas sobre tratamento de formulários e segurança de dados. O material pago me deu uma base linear sem que eu precisasse ficar pescando conteúdo quebrado no Google." - Roberto N., Engenheiro de Sistemas.

Aprender funções soltas na internet é o primeiro passo, mas construir uma arquitetura comercial segura exige método. Garanta a nossa Apostila de PHP Oficial: estude offline no seu ritmo, tenha acesso a listas de exercícios práticos com gabarito estruturado e aprenda como blindar suas APIs contra ataques reais de injeção de dados. Invista no seu futuro profissional!

📥 Baixar Apostila PHP Progressivo em PDF
Capa digital da Apostila PHP Progressivo com fundo transparente

Construindo o Script de Validação de Formulário

Para entender a interação do usuário com o servidor back-end, criamos um exemplo completo unificando a camada estrutural de marcação (HTML5) com o script de captura. Utilizamos a verificação de existência das chaves na superglobal $_GET através do operador de coalescência nula (??), evitando que o interpretador dispare Notices indesejados no servidor de produção.

Adicionalmente, aplicamos a coerção forçada dos dados recebidos para inteiros ((int)), garantindo conformidade com a tipagem estrita exigida a partir do PHP 8.x.


<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Validação Avançada com checkdate - PHP Progressivo</title>
</head>
<body>

    <!-- Formulário de Envio para Captura de Dados -->
    <form action="" method="get" style="margin-bottom: 20px;">
        <label>Dia: <input type="number" name="day" required /></label><br><br>
        <label>Mês: <input type="number" name="month" required /></label><br><br>
        <label>Ano: <input type="number" name="year" required /></label><br><br>
        <input type="submit" name="submit" value="Validar Data Comercial" />
    </form> 

<?php
// Verificamos se o formulário foi devidamente submetido pelo cliente
if (isset($_GET['submit'])) {
    
    // Capturando os inputs e convertendo de forma segura para inteiros (Sanitização)
    $dia = (int)($_GET['day'] ?? 0);
    $mes = (int)($_GET['month'] ?? 0);
    $ano = (int)($_GET['year'] ?? 0);
    
    // Execução da regra lógica da engine gregoriana
    if (checkdate($mes, $dia, $ano)) {
        echo "<div style='color: green; font-weight: bold;'>Sucesso: A data {$dia}/{$mes}/{$ano} é válida e existente!</div>";
    } else {
        echo "<div style='color: red; font-weight: bold;'>Erro Crítico: A data {$dia}/{$mes}/{$ano} é totalmente inválida!</div>";
    }
}
?>

</body>
</html>

⚙️ Execução Prática Interativa

Utilize a nossa caixa de simulação abaixo para rodar o motor do algoritmo em tempo real. Digite os valores numéricos e veja como a lógica do motor back-end responde imediatamente:

Simulador de Verificação do Calendário

⚠️ Alerta / Atenção Sênior: Tratamento de Exceções no PHP 8+
Se o seu arquivo de configuração possuir tipos estritamente declarados (strict_types=1), passar variáveis do tipo String ou valores vindos de formulários sem a devida coerção de tipo (Type Casting) disparará um erro fatal do tipo TypeError. Certifique-se sempre de forçar a tipagem do input usando o operador (int) antes de submetê-los ao método.

Formação Completa de Alta Performance (Sem Limites) 🚀

O mercado internacional e as grandes fintechs não contratam profissionais de uma única função. Para atingir o nível Pleno/Sênior, você deve dominar toda a esteira de desenvolvimento: do HTML estrutural à segurança lógica de servidores Linux e consultas SQL otimizadas. Leve o nosso Mega Pack Completo com 7 Manuais Premium e mude de patamar profissional hoje mesmo!

Mega Pack completo do Projeto Progressivo contendo apostilas de PHP, Java, C e Front-end

Consolide seu Conhecimento (O que estudar a seguir)

Garantir o fluxo estável de dados é o primeiro passo para dominar a manipulação de informações dinâmicas na plataforma. Continue aprimorando seu ecossistema técnico seguindo nossa trilha lógica:

  • Manipulação Avançada: Agora que você sabe se a data existe, aprenda a realizar cálculos, somar dias e formatar layouts de exibição lendo nosso guia de Como manipular Objetos com a classe DateTime no PHP.
  • Documentação Técnica: Verifique notas históricas de desenvolvimento diretamente na Documentação Oficial da Função checkdate na PHP.net.
  • Próximo Módulo: Avance na automação do seu código descobrindo como encapsular dados com segurança total estudando os Modificadores de Visibilidade e Escopo de Atributos.

Perguntas Frequentes (FAQ) da Comunidade

A função checkdate() lida automaticamente com fusos horários (Timezones)?

Não. A função checkdate() analisa exclusivamente a composição geométrica e lógica do calendário gregoriano puro (se os números decimais fazem sentido juntos). Se o seu sistema necessita calcular fusos horários locais, horários de verão ou diferenças de localização regional, você deve utilizar a classe nativa orientada a objetos DateTime juntamente com a DateTimeZone.

Como validar strings de data completas vindas do banco de dados (Ex: "2026-05-18")?

Para strings unificadas, o mais recomendado é explodir a string utilizando caracteres delimitadores (como o método explode("-", $data)) para isolar o ano, mês e dia e então passá-los individualmente na função. De forma alternativa e moderna, você pode utilizar o método estático DateTime::createFromFormat(), capturando possíveis erros de parsing na cadeia estrutural de objetos.

Nenhum comentário: