Menu

PHP date(): obtener, formatear y calcular fechas

date('Y-m-d') devuelve la fecha de hoy como cadena, y date('Y-m-d', $timestamp) formatea cualquier timestamp Unix. Aprende time(), mktime(), strtotime(), DateTimeImmutable, sumar días, la diferencia entre dos fechas y las zonas horarias, con ejemplos que puedes ejecutar.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

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.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR