Funções matemáticas e de data
Calcular descontos, criar relatórios, exibir “publicado há 3 dias”, gerar números de pedidos — operações matemáticas e com datas são essenciais para qualquer aplicativo web.
1. Funções matemáticas comuns
<?php
// Basic operations
echo abs(-5); // 5 (absolute value)
echo ceil(3.14); // 4 (round up)
echo floor(3.99); // 3 (round down)
echo round(3.5); // 4 (rounds .5 to nearest even)
echo round(3.14159, 2); // 3.14 (2 decimal places)
// Min and max
echo max(3, 7, 2, 9); // 9 (maximum)
echo min(3, 7, 2, 9); // 2 (minimum)
echo max([5, 3, 9, 1]); // 9 (arrays work too)
// Powers and roots
echo pow(2, 3); // 8 (2 to the power of 3)
echo sqrt(16); // 4 (square root)
// Random numbers
echo rand(1, 100); // Random integer between 1 and 100
echo mt_rand(1, 1000); // High-quality random (recommended)
echo random_int(1, 10); // Cryptographically secure random (PHP 7+)
?>
mt_rand() — ele é cerca de 4 vezes mais rápido e produz números aleatórios de melhor qualidade do que rand(). Para valores sensíveis em termos de segurança, como senhas e tokens, use random_int(), que é criptograficamente seguro.
2. A função date()
date() é a função mais utilizada do PHP para formatar datas e horários por meio de uma string de formato:
<?php
// Current date and time
echo date("Y-m-d"); // 2026-06-29
echo date("l, F j, Y"); // Monday, June 29, 2026
echo date("H:i:s"); // 14:30:45
echo date("Y-m-d H:i:s"); // 2026-06-29 14:30:45
// Day of week
echo date("l"); // Monday (full weekday name)
echo date("w"); // 1 (numeric day, 0 = Sunday)
?>
(1) Caracteres de formato comum
| Caractere | Significado | Exemplo |
|---|---|---|
Y |
Ano com quatro dígitos | 2026 |
y |
Ano com dois dígitos | 26 |
m |
Mês (com zeros à esquerda) | 06 |
n |
Mês (sem preenchimento) | 6 |
d |
Dia (com zeros à esquerda) | 09 |
j |
Dia (sem preenchimento) | 9 |
H |
24 horas (com zeros à esquerda) | 14 |
i |
Minutos (com zeros à esquerda) | 30 |
s |
Segundos (com preenchimento com zeros) | 45 |
▶ Exemplo: Conversões de carimbos de data/hora
<?php
// time(): current Unix timestamp (seconds since January 1, 1970)
$now = time();
echo $now; // e.g. 1751101234
// date() accepts a timestamp as its second argument
echo date("Y-m-d H:i:s", $now);
// strtotime(): human-readable dates → timestamps
$ts = strtotime("2026-01-01 00:00:00");
echo date("F j, Y", $ts); // January 1, 2026
// strtotime is surprisingly smart
echo date("Y-m-d", strtotime("+1 week")); // One week from now
echo date("Y-m-d", strtotime("next Monday")); // Next Monday
echo date("Y-m-d", strtotime("last day of this month")); // Last day of this month
echo date("Y-m-d", strtotime("+3 months")); // Three months from now
?>
strtotime() compreende frases em linguagem natural como +1 week, next Monday e first day of next month. No entanto, não confie nela para cálculos complexos com datas — use a classe DateTime em vez disso.
3. A classe DateTime
date() e strtotime() abrangem os casos simples. Para qualquer coisa mais complexa, recorra à classe DateTime — ela é orientada a objetos e muito mais poderosa:
<?php
// Creating DateTime objects
$now = new DateTime();
$specific = new DateTime("2026-06-01 09:00:00");
$fromFormat = DateTime::createFromFormat("d/m/Y", "15/08/2026");
// Formatting output
echo $now->format("Y-m-d H:i:s");
// Adding and subtracting dates
$future = new DateTime();
$future->modify("+2 weeks");
$future->modify("+3 days");
echo $future->format("Y-m-d"); // Today + 17 days
// Calculating differences
$birthday = new DateTime("2000-01-15");
$today = new DateTime();
$diff = $birthday->diff($today);
echo "You have been alive for {$diff->days} days, {$diff->y} years";
// diff() returns a DateInterval object with y/m/d/h/i/s/days properties
?>
▶ Exemplo: Comparação de datas e intervalos
<?php
$start = new DateTime("2026-06-01");
$end = new DateTime("2026-06-30");
// Comparing dates
if ($start < $end) {
echo "Start date is before end date";
}
// Iterating over a date range
$period = new DateInterval("P7D"); // 7-day interval
$dates = new DatePeriod($start, $period, $end);
foreach ($dates as $date) {
echo $date->format("m-d") . " ";
}
// Output: 06-01 06-08 06-15 06-22 06-29
?>
4. Configuração do fuso horário
<?php
// Set the timezone (do this once at the top of your script)
date_default_timezone_set("Asia/Shanghai");
echo date("Y-m-d H:i:s"); // Now shows Shanghai time
// Check the current timezone
echo date_default_timezone_get(); // Asia/Shanghai
// Common timezones:
// Asia/Shanghai - China Standard Time (UTC+8)
// Asia/Tokyo - Japan Standard Time (UTC+9)
// Europe/London - Greenwich Mean Time / British Summer Time
// America/New_York - Eastern Time (UTC-5/UTC-4)
?>
date_default_timezone_set() no início do seu script. Sem isso, os carimbos de data e hora nos comentários dos usuários podem aparecer com um deslocamento de 8 horas.
5. Receitas com tâmaras para o dia a dia
<?php
// 1. Calculate age
function getAge(string $birthday): int {
$born = new DateTime($birthday);
$today = new DateTime();
return $born->diff($today)->y;
}
echo getAge("2000-01-15"); // 26
// 2. Display relative time ("posted 3 days ago")
function timeAgo(string $datetime): string {
$past = new DateTime($datetime);
$now = new DateTime();
$diff = $past->diff($now);
if ($diff->y > 0) return $diff->y . " year(s) ago";
if ($diff->m > 0) return $diff->m . " month(s) ago";
if ($diff->d > 0) return $diff->d . " day(s) ago";
if ($diff->h > 0) return $diff->h . " hour(s) ago";
if ($diff->i > 0) return $diff->i . " minute(s) ago";
return "just now";
}
// 3. Generate an order number
function generateOrderNo(): string {
return date("YmdHis") . mt_rand(1000, 9999);
}
echo generateOrderNo(); // 202606291430451234
?>
❓ Perguntas Frequentes
P:
date()ouDateTime— qual devo usar? R: Usedate()para formatação simples de uma linha. Opte porDateTimequando precisar calcular diferenças de datas, iterar sobre intervalos de datas, modificar datas ou compará-las.
P: Por que minha hora está 8 horas atrasada? R: Fuso horário. Chame
date_default_timezone_set("Asia/Shanghai")no seu script (ou definadate.timezone = Asia/Shanghaino seuphp.ini).
P: O que
strtotime("2026/02/29")retorna? R: O dia 29 de fevereiro não existe em 2026.strtotimecorrige automaticamente e retorna2026-03-01.DateTimelida com isso da mesma forma.
📖 Resumo
abs,ceil,floor,round,max,min,pow,sqrtsão as funções matemáticas mais utilizadasmt_rand()para números aleatórios rápidos;random_int()para valores criptograficamente segurosdate("Y-m-d H:i:s")formata data e hora por meio de caracteres de formataçãostrtotime()converte frases legíveis por humanos em registros de data e hora- A classe
DateTimelida com operações complexas relacionadas a datas (diferenças, modificações, comparações) - Defina sempre seu fuso horário:
date_default_timezone_set("Asia/Shanghai")
📝 Exercícios
- Use
date()para exibir a hora atual em três formatos diferentes: data ISO (AAAA-MM-DD), um formato completo e de fácil compreensão com o dia da semana e um formato compacto de 24 horas. - Escreva uma função
getDaysBetween($date1, $date2)que utilizeDateTimepara calcular o número de dias entre duas datas. - Escreva uma função
isWeekend($date)que retornetruese a data fornecida cair em um sábado ou domingo.



