easter_date()
Aprende a calcular la fecha de Pascua en PHP con easter_date() y easter_days(), con ejemplos seguros para zonas horarias.
Introducción
Calcular la fecha de Pascua de forma programática es una tarea sorprendentemente común: aplicaciones de calendario, sistemas de programación y software de nómina necesitan saber qué día del año cae la Pascua, ya que la fecha cambia cada año. PHP incluye dos funciones integradas para esto, easter_date() y easter_days(). Este capítulo explica cómo se calcula la Pascua, cómo se comporta cada función y cuál utilizar para evitar problemas con las zonas horarias.
Por qué la fecha de Pascua cambia
La Pascua es una fiesta movible: a diferencia de la Navidad, no tiene una fecha fija en el calendario. Según la regla establecida en el Concilio de Nicea en el año 325 d.C., el Domingo de Pascua es el primer domingo después de la primera luna llena en o después del equinoccio vernal (de primavera). Como eso depende del ciclo lunar, la fecha oscila entre el 22 de marzo y el 25 de abril de año en año.
PHP implementa internamente el algoritmo estándar computus, por lo que nunca necesitas calcular la fase lunar tú mismo.
easter_date()
easter_date() devuelve el timestamp Unix para el Domingo de Pascua de un año determinado.
- Firma:
easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int - Parámetros: El
$yearde cuatro dígitos (por defecto el año actual). El$modeopcional selecciona el cálculo gregoriano o juliano. - Valor de retorno: Un timestamp Unix para el Domingo de Pascua.
Nota: Un error común es pasar un timestamp a
easter_date(). El argumento es un año (p. ej.2023), no un timestamp. Pasarmktime(...)produce un resultado incorrecto.
La trampa está en las zonas horarias. El timestamp devuelto apunta al mediodía UTC del Domingo de Pascua, por lo que formatearlo con date() bajo una zona horaria predeterminada al oeste de UTC puede retroceder el resultado al día anterior. Para mostrar la fecha, es preferible el enfoque con easter_days() que se describe a continuación.
easter_days()
easter_days() devuelve el número de días después del 21 de marzo en que cae la Pascua, en lugar de un timestamp. Este es el bloque de construcción seguro para zonas horarias: combínalo con una fecha de calendario simple y obtendrás el día correcto independientemente de date_default_timezone_set().
- Firma:
easter_days(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int - Valor de retorno: Un desplazamiento entero (por ejemplo,
19significa 21 de marzo + 19 días).
Disponibilidad:
easter_date()yeaster_days()forman parte de la extensión de calendario de PHP. Se integraron en el núcleo en PHP 8.0 y siguen disponibles en la versión actual de PHP (8.x) — no fueron eliminadas. Si vesCall to undefined function easter_date()en una compilación antigua, habilita la extensióncalendar.
Código de ejemplo
Recomendado — seguro para zonas horarias mediante easter_days()
<?php
$year = 2023;
$easter = (new DateTimeImmutable("$year-03-21"))
->modify('+' . easter_days($year) . ' days');
echo $easter->format('F j, Y'); // Outputs: April 9, 2023Versión rápida en una línea con easter_date()
<?php
$year = 2023;
echo date('F j, Y', easter_date($year));easter_date() ancla el timestamp al mediodía UTC, por lo que el día del calendario que ves depende de la zona horaria de formato — observa cómo el mismo año se muestra de forma diferente a continuación. Esta es precisamente la razón por la que la versión con easter_days() anterior es la opción más segura:
<?php
date_default_timezone_set('UTC');
echo date('F j, Y H:i', easter_date(2024)); // Outputs: March 30, 2024 20:00Lectura relacionada
Conclusión
La Pascua es una fiesta movible, por lo que su fecha debe calcularse a partir del calendario lunar cada año. PHP realiza los cálculos complejos por ti a través de la extensión de calendario. Para el código de visualización, es preferible usar easter_days() combinado con un DateTimeImmutable para que el resultado no se vea afectado por la zona horaria del servidor; usa easter_date() para obtener un timestamp rápido cuando controlas la zona horaria predeterminada.