strtotime() en PHP: convertir cadenas de texto en timestamps

strtotime() es una de las funciones más útiles —y más mal utilizadas— de PHP. Acepta casi cualquier descripción de fecha en texto y la convierte en un timestamp Unix. Funciona con cadenas absolutas como «2026-07-20», con cadenas relativas como «next Monday» o «+3 days», y con combinaciones de ambas.

Sintaxis básica

<?php
// Cadena absoluta en formato ISO 8601
$ts = strtotime('2026-07-20 11:00:00');
echo date('d/m/Y H:i:s', $ts); // 20/07/2026 11:00:00

// Formato europeo con barras (requiere cuidado: m/d/Y en inglés)
$ts2 = strtotime('20-07-2026');
echo date('d/m/Y', $ts2); // 20/07/2026
?>

El segundo parámetro opcional permite especificar un timestamp de referencia para las expresiones relativas. Si se omite, se usa time().

Cadenas relativas

Aquí es donde strtotime() brilla de verdad. Entiende expresiones en inglés para fechas relativas:

<?php
$ahora = time();

// Desplazamientos simples
echo date('d/m/Y', strtotime('+1 day',   $ahora)); // mañana
echo date('d/m/Y', strtotime('+1 week',  $ahora)); // en 7 días
echo date('d/m/Y', strtotime('+1 month', $ahora)); // mismo día mes siguiente
echo date('d/m/Y', strtotime('+1 year',  $ahora)); // año siguiente

// Días de la semana
echo date('d/m/Y', strtotime('next Monday'));    // próximo lunes
echo date('d/m/Y', strtotime('last Friday'));    // viernes pasado
echo date('d/m/Y', strtotime('this Sunday'));    // domingo de esta semana

// Inicio/fin de unidades
echo date('d/m/Y', strtotime('first day of this month'));
echo date('d/m/Y', strtotime('last day of this month'));
echo date('d/m/Y', strtotime('first day of next month'));
?>

Cadenas combinadas

Se puede combinar una fecha base con un desplazamiento:

<?php
// 15 de julio más 10 días
$base  = '2026-07-15';
$ts    = strtotime('+10 days', strtotime($base));
echo date('d/m/Y', $ts); // 25/07/2026

// El día anterior a una fecha concreta
$ayer = strtotime('-1 day', strtotime('2026-07-20'));
echo date('d/m/Y', $ayer); // 19/07/2026
?>

Calcular vencimientos reales

Un caso de uso habitual: añadir períodos a una fecha de inicio para calcular cuándo vence algo.

<?php
// Suscripción mensual creada hoy
$inicio  = date('Y-m-d');
$fin     = strtotime('+1 month', strtotime($inicio));
echo 'Vence el: ' . date('d/m/Y', $fin);

// Prueba gratuita de 14 días
$registro = '2026-07-20';
$finPrueba = strtotime('+14 days', strtotime($registro));
echo 'Prueba hasta: ' . date('d/m/Y', $finPrueba); // 03/08/2026
?>

Validar fechas de usuario

strtotime() devuelve false cuando no puede interpretar la cadena. Conviene comprobar siempre ese caso:

<?php
function fechaValida(string $input): bool
{
    $ts = strtotime($input);
    if ($ts === false) {
        return false;
    }
    // Comprobar además que la fecha resultante no es absurda
    // (strtotime puede parsear fechas fuera de rango de formas inesperadas)
    return checkdate(
        (int) date('m', $ts),
        (int) date('d', $ts),
        (int) date('Y', $ts)
    );
}

var_dump(fechaValida('2026-07-20')); // true
var_dump(fechaValida('hola mundo')); // false
var_dump(fechaValida('2026-02-30')); // false (30 de febrero no existe)
?>

Cuándo usar DateTimeImmutable en su lugar

strtotime() tiene limitaciones importantes. No maneja zonas horarias de forma explícita, y el parseo de formatos ambiguos (como 01/02/03) puede dar sorpresas. Para lógica de fechas más compleja, DateTimeImmutable::createFromFormat() es más seguro:

<?php
// strtotime interpreta 01/02/2026 como mes/día/año (formato americano)
$ts = strtotime('01/02/2026');
echo date('d/m/Y', $ts); // 02/01/2026 ? ¡sorpresa!

// DateTimeImmutable con formato explícito: sin ambigüedad
$dt = DateTimeImmutable::createFromFormat('d/m/Y', '01/02/2026');
echo $dt->format('d/m/Y'); // 01/02/2026 ?
?>

Usa strtotime() para expresiones relativas simples, procesamiento de fechas ISO 8601 o scripts rápidos. Para aplicaciones con zonas horarias, formatos variables o fechas que provienen del usuario, DateTimeImmutable ofrece más control y menos margen de error. La documentación oficial de strtotime() incluye la lista completa de formatos soportados.

COMPARTE ESTE ARTÍCULO

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