easter_date()
Calcola la data di Pasqua in PHP con easter_date() e easter_days(), con esempi sicuri per i fusi orari.
Introduzione
Calcolare programmaticamente la data di Pasqua è un'esigenza sorprendentemente comune — le app di calendario, i sistemi di pianificazione e i software per le buste paga devono sapere in quale giorno dell'anno cade la Pasqua, poiché la data cambia ogni anno. PHP include due funzioni integrate per questo scopo, easter_date() e easter_days(). Questo capitolo spiega come viene calcolata la Pasqua, il comportamento di ciascuna funzione e quale scegliere per evitare problemi con i fusi orari.
Perché la data di Pasqua cambia
La Pasqua è una festa mobile: a differenza del Natale, non ha una data fissa nel calendario. Secondo la regola stabilita dal Concilio di Nicea nel 325 d.C., la domenica di Pasqua è la prima domenica dopo il primo plenilunio che cade il giorno dell'equinozio di primavera o successivamente. Poiché dipende dal ciclo lunare, la data oscilla tra il 22 marzo e il 25 aprile da un anno all'altro.
PHP implementa internamente l'algoritmo standard del computus, quindi non è mai necessario calcolare la fase lunare manualmente.
easter_date()
easter_date() restituisce il timestamp Unix della domenica di Pasqua di un determinato anno.
- Firma:
easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int - Parametri: L'anno a quattro cifre
$year(il valore predefinito è l'anno corrente). Il parametro opzionale$modeseleziona il calcolo gregoriano o giuliano. - Valore restituito: Un timestamp Unix per la domenica di Pasqua.
Nota: Un errore comune è passare un timestamp a
easter_date(). L'argomento è un anno (ad esempio2023), non un timestamp. Passaremktime(...)produce un risultato errato.
Il problema riguarda i fusi orari. Il timestamp restituito punta a mezzogiorno UTC della domenica di Pasqua, quindi formattandolo con date() sotto un fuso orario predefinito a ovest di UTC si può ottenere il giorno precedente. Per la visualizzazione, è preferibile l'approccio con easter_days() descritto di seguito.
easter_days()
easter_days() restituisce il numero di giorni dopo il 21 marzo in cui cade la Pasqua, invece di un timestamp. È il blocco costruttivo sicuro per i fusi orari: combinandolo con una semplice data del calendario si ottiene il giorno corretto indipendentemente da date_default_timezone_set().
- Firma:
easter_days(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int - Valore restituito: Un offset intero (ad esempio,
19significa 21 marzo + 19 giorni).
Disponibilità:
easter_date()eeaster_days()fanno parte dell'estensione calendario di PHP. Sono state integrate nel core in PHP 8.0 e sono ancora disponibili nelle versioni correnti di PHP (8.x) — non sono state rimosse. Se compare l'erroreCall to undefined function easter_date()su una build precedente, abilitare l'estensionecalendar.
Codice di esempio
Consigliato — sicuro per i fusi orari tramite 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, 2023Soluzione rapida con easter_date()
<?php
$year = 2023;
echo date('F j, Y', easter_date($year));easter_date() ancora il timestamp a mezzogiorno UTC, quindi il giorno del calendario visualizzato dipende dal fuso orario di formattazione — si noti come lo stesso anno venga stampato diversamente di seguito. Questo è esattamente il motivo per cui la versione con easter_days() mostrata sopra è la scelta più sicura:
<?php
date_default_timezone_set('UTC');
echo date('F j, Y H:i', easter_date(2024)); // Outputs: March 30, 2024 20:00Letture correlate
Conclusione
La Pasqua è una festa mobile, quindi la sua data deve essere calcolata dal calendario lunare ogni anno. PHP esegue i calcoli complessi tramite l'estensione calendario. Per il codice di visualizzazione, preferire easter_days() combinato con un DateTimeImmutable in modo che il risultato non sia influenzato dal fuso orario del server; usare easter_date() per ottenere rapidamente un timestamp quando si controlla il fuso orario predefinito.