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')
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.
?>
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.";
?>
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:
- Como o PHP lida com o Futuro? Se você achou genial o dia 0 da
mktime(), você precisa entender a Matemática por trás da Função mktime(). - Datas em Bancos de Dados: Sabia que o MySQL prefere um formato diferente? Veja como Formatar Datas do PHP para o MySQL (Y-m-d).
- Consulta Direta: Revise todos os parâmetros no Manual Oficial da date() no PHP.net.
Perguntas Frequentes (FAQ) da Comunidade
O comando date('t') entende se o ano atual é bissexto automaticamente?
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()?
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:
Postar um comentário