date('Y-m-d') retorna a data de hoje como string, por exemplo 2026-03-14. O primeiro argumento é uma string de formato em que cada letra representa uma parte da data (Y o ano, m o mês, d o dia, H:i:s a hora), e um segundo argumento opcional é um timestamp Unix para formatar no lugar do momento atual.
A saída muda cada vez que você clica em Run, porque é a data e a hora atuais em UTC. Cada letra da string de formato, e como colocar texto comum entre elas, está na página sobre o formato de data no PHP.
Timestamps: time(), mktime() e strtotime()
Um timestamp Unix é o número de segundos desde 1º de janeiro de 1970 à meia-noite UTC. time() retorna o atual, mktime(hour, minute, second, month, day, year) monta um a partir das partes, e strtotime() lê uma data escrita em inglês ('2026-03-14', '+1 week', 'next monday'). Passe qualquer timestamp como segundo argumento do date(). O segundo argumento do strtotime() é o momento a partir do qual uma frase relativa conta; sem ele, conta a partir de agora.
Saída:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
O transbordo no mktime() é útil: o dia 0 de um mês é o último dia do mês anterior, então mktime(0, 0, 0, 3, 0, 2026) é 28 de fevereiro. Sempre compare o resultado com false antes de passá-lo adiante: date('Y-m-d', false) imprime em silêncio 1970-01-01, uma data que ninguém quis.
Somar dias a uma data
Para qualquer coisa além de imprimir, use DateTimeImmutable. O método modify() dele recebe as mesmas frases que o strtotime() e retorna uma nova data, e add() recebe um DateInterval como P7D (um período de 7 dias) ou PT90M (90 minutos).
Saída:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
31 de fevereiro não existe, então +1 month a partir de 31 de janeiro cai em 3 de março. Quando você quer dizer "o fim do mês que vem", diga isso com last day of next month.
DateTime ou DateTimeImmutable
O DateTime altera a si mesmo quando você chama modify(), add() ou setDate(), e retorna o mesmo objeto. Isso surpreende quem guarda a data original numa variável:
Saída:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
Prefira DateTimeImmutable em código novo. As duas classes têm os mesmos métodos e as duas implementam DateTimeInterface, então uma função pode aceitar qualquer uma delas.
Diferença entre duas datas
O diff() retorna um DateInterval. A propriedade days dele é o número total de dias entre as duas datas, enquanto y, m e d dividem o intervalo em anos, meses e dias, exatamente o que um cálculo de idade precisa. Mude as datas e rode de novo:
Saída:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
No format(), %a é o total de dias e %d é só a parte dos dias, então %a é o que se usa para "dias até". Para comparar duas datas sem calcular a diferença, os operadores comuns funcionam com objetos de data: $today < $christmas é true.
Fusos horários
O date() e o new DateTimeImmutable() usam o fuso horário padrão, que vem do date.timezone no php.ini (UTC quando não está definido). Defina-o para o script inteiro com date_default_timezone_set(), ou dê a uma única data o próprio DateTimeZone e converta com setTimezone():
Saída:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
Um timestamp é o mesmo número em qualquer lugar; o fuso horário só muda como ele é escrito. É por isso que o conselho comum é guardar datas em UTC e converter na hora de exibir.
Mostrar um calendário numa página web
Datas costumam ser impressas em HTML. Este bloco desenha o mês atual como calendário e destaca o dia de hoje. Rode e clique em Previous ou Next: o mesmo script roda de novo com $_GET['m'] definido pelo link, como ?m=2026-04.
format('N') dá o dia da semana de 1 (segunda) a 7 (domingo), que é a quantidade de células vazias antes do dia 1º, e format('t') dá o número de dias do mês. O ! em '!Y-m' zera todos os campos que o formato não menciona, então o dia é o 1º e a hora é meia-noite.
Erros comuns com date()
O segundo argumento do date() precisa ser um timestamp, não uma string de data. Esta linha:
<?php
echo date('d/m/Y', '2026-03-14');
interrompe o script com um TypeError:
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
Converta a string antes, com strtotime() ou com um objeto:
Saída:
14/03/2026
14/03/2026
bool(false)
bool(true)
Mais dois para ficar de olho: m é o mês e i são os minutos, então 'H:m' imprime o mês onde você queria os minutos; e new DateTimeImmutable('garbage') lança uma exceção em vez de retornar false, então envolva entradas do usuário em try/catch ou faça o parse com DateTimeImmutable::createFromFormat(), que retorna false quando não bate.
Perguntas frequentes
Como pego a data atual no PHP?
Chame date() com uma string de formato: echo date('Y-m-d'); imprime a data de hoje como 2026-03-14, e date('Y-m-d H:i:s') adiciona a hora. A versão com objeto é (new DateTimeImmutable())->format('Y-m-d').
Como somo dias a uma data no PHP?
Use modify() num DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') dá 2026-03-21. Com timestamps, date('Y-m-d', strtotime('+7 days', $timestamp)) faz o mesmo.
Como calculo a diferença entre duas datas no PHP?
Chame diff() numa data passando a outra: $a->diff($b) retorna um DateInterval. A propriedade days dele é o número total de dias, e y, m, d guardam os anos, meses e dias, que é como você calcula a idade de alguém.
Como converto um timestamp Unix em data no PHP?
Passe-o como segundo argumento do date(): date('Y-m-d H:i:s', 1773479107) retorna 2026-03-14 09:05:07 em UTC. Para um objeto, use new DateTimeImmutable('@1773479107').
Por que o date() do PHP mostra a hora errada?
O date() usa o fuso horário padrão, que vem do date.timezone no php.ini e muitas vezes é UTC. Defina o seu com date_default_timezone_set('America/Sao_Paulo') no topo do script, ou passe um DateTimeZone para o DateTimeImmutable.