Un formato de fecha de PHP es una cadena en la que las letras representan partes de la fecha: date('Y-m-d H:i:s') imprime algo como 2026-03-14 09:05:07. Y es el año con 4 dígitos, m el mes, d el día, H la hora (reloj de 24 horas), i los minutos y s los segundos; cualquier carácter que no sea una letra de formato, como -, / o :, se imprime tal cual. Las mismas cadenas de formato funcionan en date() y en DateTimeImmutable::format().
Cambia $format y pulsa Ejecutar. La fecha está fijada en el sábado 14 de marzo de 2026 a las 09:05:07, así que puedes ver exactamente qué hace cada letra:
Salida:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format) formatea el momento actual y date($format, $timestamp) un timestamp; $date->format($format) formatea un objeto de fecha. Todo lo demás sobre las fechas, de strtotime() a las zonas horarias, está en la página de PHP date().
Caracteres de formato de fecha
Cada ejemplo de abajo es el resultado para 2026-03-14 09:05:07.123456 UTC.
Día
| Carácter | Significado | Ejemplo |
|---|---|---|
d | Día del mes, 2 dígitos con cero inicial (01 a 31) | 14 |
j | Día del mes sin cero inicial (1 a 31) | 14 |
D | Nombre corto del día, 3 letras | Sat |
l (L minúscula) | Nombre completo del día | Saturday |
N | Día de la semana ISO, 1 (lunes) a 7 (domingo) | 6 |
w | Día de la semana, 0 (domingo) a 6 (sábado) | 6 |
S | Sufijo inglés del día: st, nd, rd o th. Úsalo después de j | th |
z | Día del año, empezando en 0 | 72 |
Semana y mes
| Carácter | Significado | Ejemplo |
|---|---|---|
W | Número de semana ISO 8601 (las semanas empiezan en lunes) | 11 |
F | Nombre completo del mes | March |
M | Nombre corto del mes, 3 letras | Mar |
m | Número del mes con cero inicial (01 a 12) | 03 |
n | Número del mes sin cero inicial (1 a 12) | 3 |
t | Número de días del mes | 31 |
Año
| Carácter | Significado | Ejemplo |
|---|---|---|
Y | Año completo, al menos 4 dígitos | 2026 |
y | Año, 2 dígitos | 26 |
L | 1 si es año bisiesto, si no 0 | 0 |
o | Año de numeración de semanas ISO 8601 (úsalo con W) | 2026 |
X | Año completo ampliado con signo (PHP 8.2+) | +2026 |
x | Año completo ampliado, con signo solo cuando hace falta (PHP 8.2+) | 2026 |
Hora
| Carácter | Significado | Ejemplo |
|---|---|---|
H | Hora, reloj de 24 horas, con cero inicial (00 a 23) | 09 |
G | Hora, reloj de 24 horas, sin cero inicial (0 a 23) | 9 |
h | Hora, reloj de 12 horas, con cero inicial (01 a 12) | 09 |
g | Hora, reloj de 12 horas, sin cero inicial (1 a 12) | 9 |
i | Minutos con cero inicial (00 a 59) | 05 |
s | Segundos con cero inicial (00 a 59) | 07 |
a | am o pm | am |
A | AM o PM | AM |
v | Milisegundos | 123 |
u | Microsegundos (siempre 000000 en date(), que trabaja con segundos enteros) | 123456 |
B | Hora de internet Swatch (000 a 999) | 420 |
Zona horaria
| Carácter | Significado | Ejemplo |
|---|---|---|
e | Identificador de la zona horaria | UTC |
T | Abreviatura de la zona horaria | UTC |
P | Desfase respecto a UTC con dos puntos | +00:00 |
p | Como P, pero Z para UTC | Z |
O | Desfase respecto a UTC sin dos puntos | +0000 |
Z | Desfase en segundos | 0 |
I (i mayúscula) | 1 durante el horario de verano, si no 0 | 0 |
Fecha y hora completas
| Carácter | Significado | Ejemplo |
|---|---|---|
c | Fecha y hora ISO 8601 | 2026-03-14T09:05:07+00:00 |
r | Fecha RFC 2822, usada en las cabeceras de email | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Timestamp Unix (segundos desde 1970-01-01 UTC) | 1773479107 |
La misma tabla, en vivo: este bloque imprime todos los caracteres para una fecha que elijas. Pon tu cumpleaños, una fecha por la tarde o una al final de un año bisiesto:
Imprimir letras y palabras dentro de un formato
Cualquier letra de una cadena de formato se lee como un carácter de formato, así que 'Today is l' no imprime "Today is": T, o, d, a, y, i y s son todos caracteres de formato. Pon una barra invertida delante de cada letra que quieras imprimir tal cual. En una cadena entre comillas dobles, \t ya es un tabulador, así que usa comillas simples para los formatos con barras invertidas:
Salida:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
Formatos de fecha habituales
La mayor parte del código solo necesita unos pocos formatos. Este bloque los imprime como una tabla HTML, así que aparece en la pestaña Página:
Guarda y compara las fechas como Y-m-d o Y-m-d H:i:s: las cadenas en ese orden se ordenan igual que las fechas, algo que no pasa con las cadenas d/m/Y.
ISO 8601, DATE_ATOM y otros formatos estándar
PHP tiene constantes para los formatos que esperan las APIs, los feeds y las cookies. DATE_ATOM (también DateTimeInterface::ATOM) es ISO 8601 y RFC 3339, el formato que usan las APIs JSON:
Salida:
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
También existe una constante DATE_ISO8601, pero su desfase no lleva dos puntos (+0000), algo que ISO 8601 no permite en esa forma; usa DATE_ATOM.
Formato de fecha japonés (Y年m月d日)
Los caracteres que no son letras de formato se imprimen tal cual, y eso incluye los kanji, así que 'Y年n月j日' funciona tal como está escrito. n y j quitan el cero inicial (3月14日), y m y d lo conservan (03月14日). El nombre del día es la única parte que date() no puede traducir, porque solo conoce los nombres en inglés; asigna en su lugar el número w a tu propia lista:
Salida:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
Para una localización completa, incluidos los nombres de los meses en otros idiomas y la era japonesa (令和), el IntlDateFormatter de la extensión intl formatea con patrones según el idioma. Usa letras de patrón ICU (yyyy, MM, EEEE), no los caracteres de PHP de esta 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日
Convertir una fecha de un formato a otro
Para convertir 14/03/2026 en 2026-03-14, analiza la cadena con el formato en el que está escrita usando DateTimeImmutable::createFromFormat(), y luego vuelve a formatearla. Usa los mismos caracteres que la tabla. Empieza el formato con !, o los campos que no indicaste (aquí, la hora) se rellenan con el momento actual:
Salida:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
Con las fechas que escriben los usuarios, trata cualquier warning de getLastErrors() como una fecha no válida, igual que tratas false.
Errores frecuentes con los formatos de fecha
Tres bugs aparecen una y otra vez: m donde querías i, Y frente a y, y dejar que strtotime() adivine el orden del día y el mes. strtotime() lee las barras como el orden americano mes/día y los guiones o puntos como el orden día-mes, así que los mismos dígitos dan dos fechas distintas:
Salida:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
Cuando conozcas el formato de la entrada, indícalo con createFromFormat() en lugar de dejar que strtotime() adivine.
Preguntas frecuentes
¿Qué significa date('Y-m-d') en PHP?
Cada letra se sustituye por una parte de la fecha: Y es el año con 4 dígitos, m el mes con cero inicial y d el día con cero inicial, y los guiones se imprimen tal cual. El 14 de marzo de 2026 devuelve 2026-03-14.
¿Cómo convierto una fecha de un formato a otro en PHP?
Analízala con el formato en el que está y luego formatéala con el que quieres: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') devuelve 2026-03-14. createFromFormat() devuelve false cuando la cadena no coincide, así que compruébalo primero.
¿Cuál es la diferencia entre m e i en un formato de fecha de PHP?
m es el mes (01 a 12) e i son los minutos (00 a 59). Escribir 'H:m' en lugar de 'H:i' es un bug habitual: la hora muestra el número del mes donde deberían ir los minutos.
¿Cómo formateo una fecha como ISO 8601 en PHP?
Usa el carácter c o la constante DATE_ATOM: $date->format(DATE_ATOM) devuelve 2026-03-14T09:05:07+00:00. Evita DATE_ISO8601: su desfase no lleva dos puntos (+0000), lo que no es ISO 8601 válido.
¿Cómo muestro el día de la semana en japonés con date() de PHP?
date() solo imprime nombres en inglés, así que asigna el número w (0 para el domingo a 6 para el sábado) a tu propia lista: ['日','月','火','水','木','金','土'][$date->format('w')]. Con la extensión intl, IntlDateFormatter puede formatear fechas completas en cualquier idioma.