date('Y-m-d') devuelve la fecha de hoy como cadena, por ejemplo 2026-03-14. El primer argumento es una cadena de formato en la que cada letra representa una parte de la fecha (Y el año, m el mes, d el día, H:i:s la hora), y un segundo argumento opcional es un timestamp Unix que formatear en lugar del momento actual.
La salida cambia cada vez que pulsas Ejecutar, porque es la fecha y la hora actuales en UTC. Todas las letras de la cadena de formato, y cómo poner texto normal entre ellas, están en la página de formato de fecha en PHP.
Timestamps: time(), mktime() y strtotime()
Un timestamp Unix es el número de segundos desde el 1 de enero de 1970 a medianoche UTC. time() devuelve el actual, mktime(hour, minute, second, month, day, year) construye uno a partir de sus partes, y strtotime() lee una fecha escrita en inglés ('2026-03-14', '+1 week', 'next monday'). Pasa cualquier timestamp como segundo argumento de date(). El segundo argumento de strtotime() es el momento desde el que cuenta una expresión relativa; sin él, cuenta desde ahora.
Salida:
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)
El desbordamiento en mktime() es útil: el día 0 de un mes es el último día del mes anterior, así que mktime(0, 0, 0, 3, 0, 2026) es el 28 de febrero. Compara siempre el resultado con false antes de pasarlo: date('Y-m-d', false) imprime sin avisar 1970-01-01, una fecha que nadie quería.
Sumar días a una fecha
Para cualquier cosa que vaya más allá de imprimir, usa DateTimeImmutable. Su método modify() acepta las mismas expresiones que strtotime() y devuelve una fecha nueva, y add() acepta un DateInterval como P7D (un periodo de 7 días) o PT90M (90 minutos).
Salida:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
El 31 de febrero no existe, así que +1 month sobre el 31 de enero cae en el 3 de marzo. Cuando quieras decir "el final del mes siguiente", dilo con last day of next month.
DateTime vs DateTimeImmutable
DateTime se cambia a sí mismo cuando llamas a modify(), add() o setDate(), y devuelve el mismo objeto. Eso sorprende a quien guarda la fecha original en una variable:
Salida:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
Prefiere DateTimeImmutable en código nuevo. Las dos clases tienen los mismos métodos y las dos implementan DateTimeInterface, así que una función puede aceptar cualquiera de ellas.
Diferencia entre dos fechas
diff() devuelve un DateInterval. Su propiedad days es el número total de días entre las dos fechas, mientras que y, m y d reparten el intervalo en años, meses y días, que es justo lo que necesita un cálculo de edad. Cambia las fechas y vuelve a ejecutarlo:
Salida:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
En format(), %a es el total de días y %d es solo la parte de los días, así que %a es el que hay que usar para "días hasta". Para comparar dos fechas sin calcular la diferencia, los operadores normales funcionan con objetos de fecha: $today < $christmas es true.
Zonas horarias
date() y new DateTimeImmutable() usan la zona horaria por defecto, que viene de date.timezone en php.ini (UTC cuando no está fijada). Fíjala para todo el script con date_default_timezone_set(), o dale a una sola fecha su propio DateTimeZone y conviértela con setTimezone():
Salida:
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
Un timestamp es el mismo número en todas partes; la zona horaria solo cambia cómo se escribe. Por eso el consejo habitual es guardar las fechas en UTC y convertirlas al mostrarlas.
Mostrar un calendario en una página web
Las fechas se imprimen sobre todo en HTML. Este bloque dibuja el mes actual como un calendario y resalta el día de hoy. Ejecútalo y luego haz clic en Previous o Next: el mismo script se ejecuta otra vez con $_GET['m'] tomado del enlace, como ?m=2026-04.
format('N') da el día de la semana de 1 (lunes) a 7 (domingo), que es el número de celdas vacías antes del día 1, y format('t') da el número de días del mes. El ! de '!Y-m' reinicia todos los campos que el formato no menciona, así que el día es el 1 y la hora es medianoche.
Errores frecuentes con date()
El segundo argumento de date() debe ser un timestamp, no una cadena de fecha. Esta línea:
<?php
echo date('d/m/Y', '2026-03-14');
detiene el script con un TypeError:
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
Convierte antes la cadena, con strtotime() o con un objeto:
Salida:
14/03/2026
14/03/2026
bool(false)
bool(true)
Dos más a los que prestar atención: m es el mes e i son los minutos, así que 'H:m' imprime el mes donde querías los minutos; y new DateTimeImmutable('garbage') lanza una excepción en lugar de devolver false, así que envuelve la entrada del usuario en try/catch o analízala con DateTimeImmutable::createFromFormat(), que devuelve false cuando no coincide.
Preguntas frecuentes
¿Cómo obtengo la fecha actual en PHP?
Llama a date() con una cadena de formato: echo date('Y-m-d'); imprime la fecha de hoy, como 2026-03-14, y date('Y-m-d H:i:s') añade la hora. La versión con objetos es (new DateTimeImmutable())->format('Y-m-d').
¿Cómo sumo días a una fecha en PHP?
Usa modify() sobre un DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') da 2026-03-21. Con timestamps, date('Y-m-d', strtotime('+7 days', $timestamp)) hace lo mismo.
¿Cómo calculo la diferencia entre dos fechas en PHP?
Llama a diff() sobre una fecha pasándole la otra: $a->diff($b) devuelve un DateInterval. Su propiedad days es el número total de días, y y, m, d contienen los años, meses y días, que es como se calcula la edad de alguien.
¿Cómo convierto un timestamp Unix en una fecha en PHP?
Pásalo como segundo argumento de date(): date('Y-m-d H:i:s', 1773479107) devuelve 2026-03-14 09:05:07 en UTC. Para un objeto, usa new DateTimeImmutable('@1773479107').
¿Por qué date() de PHP muestra la hora equivocada?
date() usa la zona horaria por defecto, que viene de date.timezone en php.ini y a menudo es UTC. Fija la tuya con date_default_timezone_set('Europe/Berlin') al principio del script, o pasa un DateTimeZone a DateTimeImmutable.