DateTimeImmutable es una clase para representar fechas y horas sin modificar accidentalmente el valor original.
Antiguamente, en PHP se usaba la función date() y time() para todo. Aunque siguen existiendo, son limitadas: manejan el tiempo como simples cadenas de texto o números (timestamps), lo que complica hacer cálculos (sumar días, restar horas) o manejar zonas horarias.
La forma moderna y profesional es usar la clase DateTime. Trata el tiempo como un objeto inteligente, no como un texto tonto.
El problema de la mutabilidad (DateTime)
La clase estándar DateTime es mutable. Esto significa que si modificas el objeto (por ejemplo, sumándole un día), el objeto original cambia.
Esto puede causar bugs silenciosos si pasas esa fecha a otra función y esa función la modifica sin que tú lo sepas.
// Ejemplo con DateTime (Mutable)
$fecha = new DateTime('2023-01-01');
echo $fecha->format('Y-m-d'); // Salida: 2023-01-01
// Modificamos la fecha
$fecha->modify('+1 month');
// ¡OJO! La variable original $fecha ha cambiado
echo $fecha->format('Y-m-d'); // Salida: 2023-02-01La solución moderna: DateTimeImmutable
Para evitar accidentes, en PHP moderno se prefiere DateTimeImmutable. Como su nombre indica, no cambia. Cada vez que intentas modificarla, en lugar de alterar el original, te devuelve una copia nueva con el cambio aplicado.
// Ejemplo con DateTimeImmutable (Recomendado)
$fechaOriginal = new DateTimeImmutable('2023-01-01');
// Intentamos modificarla, pero guardamos el resultado en OTRA variable
$fechaNueva = $fechaOriginal->modify('+1 month');
echo $fechaOriginal->format('Y-m-d'); // Salida: 2023-01-01 (¡Intacta!)
echo $fechaNueva->format('Y-m-d'); // Salida: 2023-02-01 (La copia modificada)Acostúmbrate a usar siempre DateTimeImmutable por defecto. Hace tu código más predecible y evita errores difíciles de rastrear.
Operaciones comunes
Olvídate de calcular segundos manualmente. Estos objetos tienen métodos para todo:
A. Formatear (Mostrar la fecha)
En lugar de date(), usas el método ->format() del objeto.
$ahora = new DateTimeImmutable();
echo $ahora->format('d/m/Y H:i:s'); // Ej: 25/10/2023 14:30:00B. Cálculos (Sumar y Restar)
Puedes usar lenguaje natural en inglés.
$cita = new DateTimeImmutable('2023-10-01');
$vencimiento = $cita->modify('+2 weeks 3 days'); // Suma 2 semanas y 3 díasC. Diferencia entre fechas (diff)
Calcula el tiempo exacto entre dos fechas. Devuelve un objeto DateInterval.
$nacimiento = new DateTimeImmutable('1990-05-20');
$hoy = new DateTimeImmutable();
$diferencia = $nacimiento->diff($hoy);
echo "Tienes " . $diferencia->y . " años y " . $diferencia->m . " meses.";D. Zonas Horarias (DateTimeZone)
Fundamental si tu servidor está en un país y tus usuarios en otro.
// Crear fecha especificando la zona horaria
$zonaMadrid = new DateTimeZone('Europe/Madrid');
$fechaMadrid = new DateTimeImmutable('now', $zonaMadrid);