date() y mktime() en PHP: formatear fechas y crear timestamps Unix

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP