Fecha y Hora en PHP
Aprende a trabajar con fechas en PHP: formatea con date(), configura la zona horaria, analiza cadenas con strtotime() y haz aritmética con DateTime.
Casi toda aplicación web necesita trabajar con fechas y horas: marcas de tiempo en publicaciones, fechas de vencimiento, etiquetas de "hace 3 días", programación, registros. PHP te proporciona dos herramientas complementarias para esto: la familia de funciones procedurales date() para formateo rápido, y la clase orientada a objetos DateTime para aritmética de fechas más segura y potente.
Este capítulo te muestra cómo mostrar la fecha actual, controlar la zona horaria, convertir cadenas legibles por humanos en marcas de tiempo, y calcular la diferencia entre dos fechas — junto con los errores comunes en los que la gente suele caer.
Cómo PHP representa el tiempo
Internamente, PHP almacena un punto en el tiempo como un timestamp Unix: el número de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970. time() devuelve el timestamp actual, y la mayoría de las funciones de fecha aceptan uno como entrada:
<?php
echo time(); // e.g. 1750464000 (an integer)
echo date("Y-m-d"); // turns "now" into a readable string
?>Un timestamp es independiente de la zona horaria — representa el mismo instante en cualquier parte del mundo. La zona horaria solo importa cuando formateas ese instante en una cadena legible por humanos, por eso es importante configurar la zona horaria correctamente (ver más abajo).
Uso básico de date()
La función date() convierte un timestamp en una cadena formateada:
date(string $format, ?int $timestamp = null): string$formates una cadena de caracteres de formato que describe cómo debe verse la salida.$timestampes opcional. Si se omite,date()usa la hora actual.
Aquí está la fecha actual en formato dd/mm/yyyy:
Cualquier carácter que no sea un código de formato se imprime literalmente, por lo que puedes mezclar separadores y texto:
<?php
echo date("l, F j, Y"); // e.g. Saturday, June 21, 2025
echo "\n";
echo date("Y-m-d H:i:s"); // e.g. 2025-06-21 14:30:05
?>Códigos de formato
date() acepta docenas de caracteres de formato. Estos son los que usarás con más frecuencia:
| Código | Significado | Ejemplo |
|---|---|---|
d | Día del mes, 2 dígitos | 01 – 31 |
j | Día del mes, sin cero inicial | 1 – 31 |
D | Nombre del día, abreviado | Mon – Sun |
l | Nombre del día, completo | Monday – Sunday |
m | Mes, 2 dígitos | 01 – 12 |
n | Mes, sin cero inicial | 1 – 12 |
M | Nombre del mes, abreviado | Jan – Dec |
F | Nombre del mes, completo | January – December |
Y | Año, 4 dígitos | 2025 |
y | Año, 2 dígitos | 25 |
H | Hora, formato 24h, 2 dígitos | 00 – 23 |
h | Hora, formato 12h, 2 dígitos | 01 – 12 |
i | Minutos, 2 dígitos | 00 – 59 |
s | Segundos, 2 dígitos | 00 – 59 |
A | AM / PM | AM, PM |
U | Timestamp Unix | 1750464000 |
Para imprimir una letra que resulta ser un código de formato (por ejemplo una H literal), escápala con una barra invertida: date('\H:i').
Configurar la zona horaria
date() formatea las horas según la zona horaria predeterminada del servidor. Depender del valor predeterminado del servidor es una fuente común del error "la hora está desfasada unas horas". Establece la zona horaria explícitamente al inicio de tu script (o en php.ini):
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s"); // formatted for New York time
?>Usa los nombres de zona horaria IANA como Europe/London, Asia/Tokyo, o UTC. Para una descripción general de cómo PHP maneja las regiones y el horario de verano, consulta el capítulo de Zonas Horarias en PHP.
Analizar cadenas y convertirlas en timestamps
Cuando una fecha llega como texto — desde un formulario, una API o una base de datos — strtotime() la convierte en un timestamp con el que puedes formatear o hacer cálculos. Entiende tanto fechas absolutas como frases relativas en inglés:
strtotime() es tolerante pero ambigua. Una cadena como 01/02/2022 se interpreta como mes/día (estilo americano). Para analizar de forma predecible un formato conocido, prefiere DateTime::createFromFormat() (más abajo). Cuando strtotime() no puede entender la entrada, devuelve false, así que siempre verifica el resultado. Consulta el capítulo dedicado a strtotime() para ver la lista completa de frases aceptadas.
La clase DateTime
Para todo lo que va más allá de la simple visualización, la API orientada a objetos DateTime es el enfoque moderno y recomendado. Evita los límites de desbordamiento de enteros, maneja las zonas horarias de forma limpia y hace que la aritmética de fechas sea legible:
<?php
$date = new DateTime("2022-01-01 12:00:00");
// Format it
echo $date->format("l, F j, Y"); // Saturday, January 1, 2022
echo "\n";
// Add or subtract durations with DateInterval
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2022-01-11
?>DateTimeImmutable funciona de la misma manera, pero nunca modifica el objeto original — modify() devuelve una nueva instancia en su lugar. Préfierela cuando pases fechas entre funciones, para que un método llamado en otro lugar no pueda mutar silenciosamente tu valor.
Calcular la diferencia entre dos fechas
DateTime::diff() devuelve un DateInterval que describe la diferencia entre dos fechas, lo cual es mucho más seguro que restar timestamps sin procesar:
<?php
$start = new DateTime("2022-01-01");
$end = new DateTime("2022-03-15");
$diff = $start->diff($end);
echo $diff->days . " days total\n"; // 73 days total
echo $diff->format("%m months, %d days"); // 2 months, 14 days
?>Para el equivalente en forma de función, consulta el capítulo date_diff().
Errores comunes
- El problema del año 2038. En sistemas de 32 bits,
date()ystrtotime()trabajan con enteros con signo de 32 bits y fallan en2038-01-19 03:14:07 UTC.DateTimeno se ve afectado, así que úsalo para fechas muy lejanas en el futuro o el pasado. date()no esDate(). Los nombres de funciones en PHP no distinguen entre mayúsculas y minúsculas, pero los códigos de formato sí:m(mes) yM(nombre del mes) son diferentes.- Advertencia de zona horaria faltante. Sin una zona horaria configurada, las versiones antiguas de PHP emiten una advertencia. Llama a
date_default_timezone_set()al principio del script. strtotime()devuelvefalse, no0, en caso de error — y0es un timestamp válido (la época Unix), así que prueba con=== false.
Conclusión
PHP te ofrece un amplio espectro de herramientas para fechas y horas. Usa date() y time() para formateo rápido, strtotime() para analizar cadenas entrantes, y las clases DateTime / DateTimeImmutable para aritmética con zonas horarias y comparaciones de fechas. Establece tu zona horaria explícitamente, valida las entradas analizadas y prefiere DateTime siempre que necesites sumar, restar o comparar fechas.
A continuación, explora los componentes en profundidad: la función date() de PHP, strtotime() y las Zonas Horarias en PHP.