Como Saber Quantos Dias Tem o Mês no PHP (Atual, Passado e Futuro)

Descobrindo o Número de Dias de um Mês no PHP: Do Básico às Técnicas Avançadas

Por que contar os dias de um mês é tão importante?

Uma das grandes utilidades de se trabalhar com datas no back-end é saber quantos dias exatos um determinado mês possui. Pense bem: se você está programando um sistema de assinaturas tipo Netflix, e o cliente assina no dia 31 de janeiro, quando será a próxima cobrança se fevereiro só vai até o dia 28?

Errar esse cálculo significa perder dinheiro ou irritar o usuário. Neste tutorial, vamos te mostrar como o PHP resolve isso de maneira incrivelmente simples, sem que você precise decorar calendários ou escrever dezenas de comandos if/else para descobrir anos bissextos.


Número de Dias do Mês Atual: O parâmetro date('t')

Como pegar o último dia do mês atual?
No PHP, basta utilizar a função date('t'). A letra 't' minúscula é um parâmetro especial de formatação que não retorna uma data, mas sim o número total de dias contidos no mês atual da execução do script (retornando um valor de 28 a 31).

Para deixarmos a informação completa, podemos combinar o date('t') com o date('F'), que como vimos no tutorial de parâmetros da função date(), retorna o nome do mês em inglês.

Veja como é simples montar a frase:


<?php
    echo "Há " . date('t') . " dias no mês de " . date('F');
    // Saída em fevereiro: Há 28 dias no mês de February
?>

Se você preferir exibir o formato numérico (ex: "mês 02") para não ter problemas com o idioma inglês, basta trocar o parâmetro 'F' pelo 'm':


<?php
    echo "Há " . date('t') . " dias no mês " . date('m');
    // Saída: Há 28 dias no mês 02
?>

O Jeito Certo de Escrever em Português (PHP 8+)

Em tutoriais antigos (PHP 7 ou inferior), era muito comum usar as funções setlocale() e strftime() para forçar o idioma do servidor para português. Atenção: essas funções foram descontinuadas no PHP 8.1.

Para gerar a frase "O mês de Fevereiro tem 28 dias" de forma segura nos dias de hoje, usamos a classe IntlDateFormatter. Veja o padrão ouro do mercado:


<?php
    // Instancia o formatador de datas focado apenas em extrair o nome do mês (MMMM)
    $formatadorMes = new IntlDateFormatter('pt_BR', IntlDateFormatter::NONE, IntlDateFormatter::NONE, null, null, 'MMMM');
    
    // Transforma a primeira letra em maiúscula por estética
    $nomeMes = ucfirst($formatadorMes->format(time()));
    
    echo "O mês de " . $nomeMes . " tem " . date('t') . " dias.";
    // Saída: O mês de Fevereiro tem 28 dias.
?>

Construa Lógicas Imbatíveis no Back-end 🧠

"Manipular datas era meu pesadelo. Eu criava dezenas de IFs para calcular os meses. A Apostila me ensinou atalhos e funções nativas do PHP que reduziram meus códigos pela metade!" - Carlos T., Desenvolvedor PHP.

Saber a sintaxe é fácil; dominar a lógica e os truques dos veteranos é o que separa um júnior de um programador sênior. Conheça nossa Apostila Oficial de PHP Progressivo. O material definitivo para quem quer aprender Orientação a Objetos, banco de dados e sistemas robustos sem enrolação.

📥 Baixar Apostila PHP Progressivo Agora

Número de Dias de QUALQUER Mês: O Truque Sênior da mktime()

Certo, o date('t') funciona perfeitamente para o mês em que estamos. Mas e se você precisar saber quantos dias teve fevereiro de 1988?

Para cálculos viajando no tempo, podemos resgatar nossa querida função mktime(). Relembrando a sintaxe dela:

mktime($hora, $minuto, $segundo, $mes, $dia, $ano);

Existe um truque lógico espetacular aqui. Se você pedir ao PHP para calcular o dia 0 do mês 3 (Março), o motor do PHP entra em curto-circuito lógico? Não! Ele é inteligente. Ele entende que o "dia 0" de um mês é, na verdade, o último dia do mês anterior!

Assim, o dia 0 do mês 3 (Março) de 1988 é o último dia do mês 2 (Fevereiro) de 1988.


<?php
    // Extraindo o dia ('d') do Timestamp gerado no dia 0 de Março (mês 3) de 1988
    $ultimo_dia = date('d', mktime(0, 0, 0, 3, 0, 1988));
    
    echo "Fevereiro de 1988 teve " . $ultimo_dia . " dias.";
    // Saída: Fevereiro de 1988 teve 29 dias. (Foi um ano bissexto!)
?>

Prontinho! A variável $ultimo_dia sempre guardará a exata quantidade de dias daquele mês específico, validando automaticamente os anos bissextos (quando fevereiro recebe 29 dias). É uma sacada genial de programação!


A Alternativa Nativa: cal_days_in_month()

Se você achou o truque da mktime() muito "hacker" e quer deixar o seu código mais legível para outros programadores que lerem o seu sistema no futuro, o PHP possui uma função nativa criada exclusivamente para contar os dias de um mês num calendário.

O nome dela é bastante sugestivo: cal_days_in_month().


<?php
    // Parâmetros: (TIPO DE CALENDÁRIO, MÊS, ANO)
    $dias_fev_1988 = cal_days_in_month(CAL_GREGORIAN, 2, 1988);
    
    echo "Usando a função nativa: " . $dias_fev_1988 . " dias.";
?>
💡 Dica Rápida: A constante CAL_GREGORIAN indica que estamos usando o Calendário Gregoriano, que é o padrão oficial usado no Brasil, em Portugal e em quase todo o ocidente hoje.

Consolide seu Conhecimento (O que estudar a seguir)

Dominar o fluxo do tempo no back-end evita dores de cabeça incalculáveis no futuro. Siga em frente na nossa apostila online com estes guias:


Perguntas Frequentes (FAQ) da Comunidade

O comando date('t') entende se o ano atual é bissexto automaticamente?

Sim, absolutamente. O motor do PHP embute cálculos astronômicos precisos baseados no sistema operacional. Se você executar um script com echo date('t'); no mês de Fevereiro de um ano bissexto (como 2024 ou 2028), ele retornará automaticamente o número 29.

Qual abordagem tem a melhor performance: date('t') ou cal_days_in_month()?

Para o mês atual, a função date('t') é microscopicamente mais rápida porque não exige a injeção de 3 parâmetros, lendo direto do Timestamp ativo. No entanto, para pesquisar meses passados ou futuros, cal_days_in_month() é muito mais limpa e gasta menos processamento do que calcular o "dia 0" via mktime(). Na prática diária corporativa, essa diferença de milissegundos é imperceptível. Use o que deixar o código mais legível para a sua equipe.

Nenhum comentário: