Um formato de data no PHP é uma string em que letras representam partes da data: date('Y-m-d H:i:s') imprime algo como 2026-03-14 09:05:07. Y é o ano com 4 dígitos, m o mês, d o dia, H a hora (relógio de 24 horas), i os minutos e s os segundos; qualquer caractere que não seja uma letra de formato, como -, / ou :, é impresso como está. As mesmas strings de formato funcionam no date() e no DateTimeImmutable::format().
Mude $format e clique em Run. A data está fixa em sábado, 14 de março de 2026, às 09:05:07, para você ver exatamente o que cada letra faz:
Saída:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format) formata o momento atual e date($format, $timestamp) um timestamp; $date->format($format) formata um objeto de data. Todo o resto sobre datas, do strtotime() aos fusos horários, está na página sobre o date() do PHP.
Caracteres de formato de data
Cada exemplo abaixo é o resultado para 2026-03-14 09:05:07.123456 UTC.
Dia
| Caractere | Significado | Exemplo |
|---|---|---|
d | Dia do mês, 2 dígitos com zero à esquerda (01 a 31) | 14 |
j | Dia do mês sem zero à esquerda (1 a 31) | 14 |
D | Nome curto do dia, 3 letras | Sat |
l (L minúsculo) | Nome completo do dia | Saturday |
N | Dia da semana ISO, 1 (segunda) a 7 (domingo) | 6 |
w | Dia da semana, 0 (domingo) a 6 (sábado) | 6 |
S | Sufixo em inglês do dia: st, nd, rd ou th. Use depois de j | th |
z | Dia do ano, começando em 0 | 72 |
Semana e mês
| Caractere | Significado | Exemplo |
|---|---|---|
W | Número da semana ISO 8601 (semanas começam na segunda) | 11 |
F | Nome completo do mês | March |
M | Nome curto do mês, 3 letras | Mar |
m | Número do mês com zero à esquerda (01 a 12) | 03 |
n | Número do mês sem zero à esquerda (1 a 12) | 3 |
t | Número de dias do mês | 31 |
Ano
| Caractere | Significado | Exemplo |
|---|---|---|
Y | Ano completo, pelo menos 4 dígitos | 2026 |
y | Ano, 2 dígitos | 26 |
L | 1 se for ano bissexto, senão 0 | 0 |
o | Ano da numeração de semanas ISO 8601 (use com W) | 2026 |
X | Ano completo expandido com sinal (PHP 8.2+) | +2026 |
x | Ano completo expandido, sinal só quando necessário (PHP 8.2+) | 2026 |
Hora
| Caractere | Significado | Exemplo |
|---|---|---|
H | Hora, relógio de 24 horas, zero à esquerda (00 a 23) | 09 |
G | Hora, relógio de 24 horas, sem zero à esquerda (0 a 23) | 9 |
h | Hora, relógio de 12 horas, zero à esquerda (01 a 12) | 09 |
g | Hora, relógio de 12 horas, sem zero à esquerda (1 a 12) | 9 |
i | Minutos com zero à esquerda (00 a 59) | 05 |
s | Segundos com zero à esquerda (00 a 59) | 07 |
a | am ou pm | am |
A | AM ou PM | AM |
v | Milissegundos | 123 |
u | Microssegundos (sempre 000000 no date(), que recebe segundos inteiros) | 123456 |
B | Swatch Internet time (000 a 999) | 420 |
Fuso horário
| Caractere | Significado | Exemplo |
|---|---|---|
e | Identificador do fuso horário | UTC |
T | Abreviação do fuso horário | UTC |
P | Diferença para UTC com dois pontos | +00:00 |
p | Como P, mas Z para UTC | Z |
O | Diferença para UTC sem dois pontos | +0000 |
Z | Diferença em segundos | 0 |
I (i maiúsculo) | 1 durante o horário de verão, senão 0 | 0 |
Data e hora completas
| Caractere | Significado | Exemplo |
|---|---|---|
c | Data e hora ISO 8601 | 2026-03-14T09:05:07+00:00 |
r | Data RFC 2822, usada em cabeçalhos de e-mail | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Timestamp Unix (segundos desde 1970-01-01 UTC) | 1773479107 |
A mesma tabela, ao vivo: este bloco imprime cada caractere para uma data que você escolher. Coloque o seu aniversário, uma data à tarde ou uma no fim de um ano bissexto:
Imprimir letras e palavras dentro de um formato
Qualquer letra numa string de formato é lida como caractere de formato, então 'Today is l' não imprime "Today is": T, o, d, a, y, i e s são todos caracteres de formato. Coloque uma barra invertida antes de cada letra que você quer imprimir como está. Numa string entre aspas duplas, \t já é um caractere de tabulação, então use aspas simples em formatos com barras invertidas:
Saída:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
Formatos de data comuns
A maior parte do código precisa só de alguns formatos. Este bloco os imprime como tabela HTML, então eles aparecem na aba Page:
Guarde e compare datas como Y-m-d ou Y-m-d H:i:s: strings nessa ordem são ordenadas do mesmo jeito que as datas, o que não acontece com strings d/m/Y.
ISO 8601, DATE_ATOM e outros formatos padrão
O PHP tem constantes para os formatos que APIs, feeds e cookies esperam. DATE_ATOM (também DateTimeInterface::ATOM) é ISO 8601 e RFC 3339, o formato que as APIs JSON usam:
Saída:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
Também existe uma constante DATE_ISO8601, mas o offset dela não tem dois pontos (+0000), o que a ISO 8601 não permite nessa forma; use DATE_ATOM.
Formato de data japonês (Y年m月d日)
Caracteres que não são letras de formato são impressos como estão, e isso inclui kanji, então 'Y年n月j日' funciona como está escrito. n e j tiram o zero à esquerda (3月14日), m e d o mantêm (03月14日). O nome do dia é a única parte que o date() não consegue traduzir, porque só conhece nomes em inglês; mapeie o número w para a sua própria lista:
Saída:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
Para localização completa, incluindo nomes de meses em outros idiomas e a era japonesa (令和), o IntlDateFormatter da extensão intl formata com padrões de locale. Ele usa letras de padrão ICU (yyyy, MM, EEEE), não os caracteres do PHP desta página:
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
Converter uma data de um formato para outro
Para transformar 14/03/2026 em 2026-03-14, faça o parse da string com o formato em que ela está escrita, usando DateTimeImmutable::createFromFormat(), e depois formate de novo. Ele usa os mesmos caracteres da tabela. Comece o formato com !, senão os campos que você não informou (a hora, aqui) são preenchidos com o momento atual:
Saída:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
Para datas digitadas por usuários, trate qualquer aviso do getLastErrors() como data inválida, do mesmo jeito que você trata false.
Erros comuns com formatos de data
Três bugs aparecem o tempo todo: m onde se queria i, Y e y, e deixar o strtotime() adivinhar a ordem de dia e mês. O strtotime() lê barras na ordem americana mês/dia e hífens ou pontos na ordem dia-mês, então os mesmos dígitos dão duas datas diferentes:
Saída:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
Quando você sabe o formato da entrada, diga isso com o createFromFormat() em vez de deixar o strtotime() adivinhar.
Perguntas frequentes
O que significa date('Y-m-d') no PHP?
Cada letra é substituída por uma parte da data: Y é o ano com 4 dígitos, m o mês com zero à esquerda e d o dia com zero à esquerda, e os hífens são impressos como estão. Em 14 de março de 2026 ele retorna 2026-03-14.
Como converto uma data de um formato para outro no PHP?
Faça o parse com o formato em que ela está e depois formate com o que você quer: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') retorna 2026-03-14. O createFromFormat() retorna false quando a string não bate, então verifique isso antes.
Qual a diferença entre m e i num formato de data do PHP?
m é o mês (01 a 12) e i são os minutos (00 a 59). Escrever 'H:m' em vez de 'H:i' é um bug comum: a hora mostra o número do mês onde deveriam estar os minutos.
Como formato uma data em ISO 8601 no PHP?
Use o caractere c ou a constante DATE_ATOM: $date->format(DATE_ATOM) retorna 2026-03-14T09:05:07+00:00. Evite DATE_ISO8601: o offset dela não tem dois pontos (+0000), o que não é ISO 8601 válido.
Como mostro o dia da semana em japonês (ou em português) com o date() do PHP?
O date() só imprime nomes em inglês, então mapeie o número w (0 para domingo até 6 para sábado) para a sua própria lista: ['日','月','火','水','木','金','土'][$date->format('w')]. Com a extensão intl, o IntlDateFormatter formata datas inteiras em qualquer locale.