Trabajar con fechas en PHP empieza casi siempre por dos funciones: time(), que devuelve el timestamp Unix actual, y date(), que convierte cualquier timestamp en una cadena legible. mktime() completa el trío permitiéndonos construir un timestamp desde sus componentes: hora, minuto, segundo, mes, día y año.
time() y el timestamp Unix
Un timestamp Unix es un entero que representa los segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC. En PHP, time() devuelve ese valor para el instante actual:
<?php echo time(); // por ejemplo: 1750000000 ?>
Al ser un entero, operar con fechas se reduce a sumas y restas de segundos: sumar 86 400 añade un día, restar 3 600 resta una hora.
date(): convertir un timestamp en cadena
La función date(string $format, int $timestamp = time()) devuelve la fecha formateada según los caracteres de formato que se indiquen. Si se omite el segundo argumento, usa el timestamp actual:
<?php
$ts = time();
echo date('Y-m-d'); // 2026-06-26
echo date('d/m/Y'); // 26/06/2026
echo date('H:i:s'); // 11:00:00
echo date('D, d M Y H:i:s'); // Fri, 26 Jun 2026 11:00:00
echo date('U'); // igual que time()
?>
Caracteres de formato más usados
- Y año con cuatro dígitos (2026)
- y año con dos dígitos (26)
- m mes con ceros (01-12)
- n mes sin ceros (1-12)
- d día con ceros (01-31)
- j día sin ceros (1-31)
- H hora en formato 24 h con ceros (00-23)
- i minutos con ceros (00-59)
- s segundos con ceros (00-59)
- N día de la semana ISO 8601 (1=lunes, 7=domingo)
- W número de semana ISO 8601
- t número de días del mes (28-31)
- L 1 si es año bisiesto, 0 si no
- U timestamp Unix
mktime(): construir un timestamp desde sus componentes
mktime(int $hour, int $minute, int $second, int $month, int $day, int $year) devuelve el timestamp Unix correspondiente a esa fecha. El orden de los parámetros es diferente al habitual, pero fácil de recordar: primero la hora completa, luego la fecha completa.
<?php
// Timestamp para el 1 de enero de 2027 a las 00:00:00
$inicio2027 = mktime(0, 0, 0, 1, 1, 2027);
echo date('Y-m-d H:i:s', $inicio2027); // 2027-01-01 00:00:00
// Último segundo del año actual
$finAnio = mktime(23, 59, 59, 12, 31, (int) date('Y'));
echo date('Y-m-d H:i:s', $finAnio); // 2026-12-31 23:59:59
?>
Calcular expiraciones sumando segundos
Uno de los casos de uso más habituales de mktime() combinado con date() es calcular la fecha de expiración de tokens, suscripciones o cachés:
<?php
// Token que expira en 24 horas
$creado = time();
$expira = $creado + 24 * 3600; // + 86400 segundos
echo 'Creado el: ' . date('d/m/Y H:i:s', $creado) . "n";
echo 'Expira el: ' . date('d/m/Y H:i:s', $expira) . "n";
// Suscripción mensual (30 días)
$inicio = mktime(0, 0, 0, 6, 1, 2026);
$fin30dias = $inicio + 30 * 86400;
echo 'Suscripción hasta: ' . date('d/m/Y', $fin30dias) . "n";
?>
El error del timezone que desplaza horas
Si la zona horaria del servidor no está configurada, PHP usa UTC y date() devolverá horas incorrectas para tu aplicación. Hay dos formas de solucionarlo:
<?php
// Opción 1: a nivel de script (afecta solo a esta ejecución)
date_default_timezone_set('Europe/Madrid');
echo date('H:i:s'); // hora de Madrid
// Opción 2: en php.ini (afecta a toda la instalación)
// date.timezone = "Europe/Madrid"
?>
Lo mejor es establecer la zona horaria una sola vez al arrancar la aplicación, no repetirlo en cada función. Guarda siempre las fechas en base de datos como UTC y convierte a la zona del usuario solo al mostrarlas.
Combinar date() con mktime() para navegación de calendarios
<?php
date_default_timezone_set('Europe/Madrid');
$mesActual = (int) date('m');
$anioActual = (int) date('Y');
// Primer y último día del mes actual
$primero = mktime(0, 0, 0, $mesActual, 1, $anioActual);
$ultimo = mktime(0, 0, 0, $mesActual + 1, 0, $anioActual); // día 0 del mes siguiente
echo date('d/m/Y', $primero) . "n"; // 01/06/2026
echo date('d/m/Y', $ultimo) . "n"; // 30/06/2026
// Total de días del mes
echo date('t', $primero) . " díasn"; // 30 días
?>
La documentación oficial de date() y de mktime() incluye la lista completa de caracteres de formato y ejemplos adicionales. Para proyectos nuevos con lógica de fechas más compleja, considera usar DateTimeImmutable, que veremos en otro artículo de esta serie.
