Introduzione
Quando si lavora con date e orari in PHP, spesso il problema non è tanto “ottenere la data”, ma capire quale data usare in un contesto reale. Un esempio molto comune è il calcolo del prossimo giorno feriale: utile per inviare notifiche, pianificare lavorazioni, posticipare scadenze o gestire processi automatici che non devono partire nel weekend.
Questo sotto-argomento è particolarmente pratico perché unisce diversi aspetti importanti della gestione delle date in PHP: uso di DateTimeImmutable, confronto tra giorni della settimana, gestione dei casi limite e scrittura di codice leggibile e riutilizzabile.
In questo tutorial vedremo come costruire una funzione robusta che, data una data di partenza, restituisce il prossimo giorno lavorativo. Il tutto con un approccio semplice ma professionale, adatto a progetti reali.
Codice completo
<?php
declare(strict_types=1);
/**
* Restituisce il prossimo giorno feriale a partire da una data data in input.
*
* Regole:
* - se la data cade dal lunedì al giovedì, il giorno successivo è feriale
* - se cade di venerdì, il prossimo giorno feriale è lunedì
* - se cade di sabato, il prossimo giorno feriale è lunedì
* - se cade di domenica, il prossimo giorno feriale è lunedì
*
* La funzione usa DateTimeImmutable per evitare modifiche accidentali
* all´oggetto originale.
*/
function getNextBusinessDay(DateTimeImmutable $date): DateTimeImmutable
{
// Avanza di un giorno alla volta finché non troviamo un giorno feriale
do {
$date = $date->modify(´+1 day´);
// ´N´ restituisce il numero del giorno della settimana:
// 1 = lunedì, 2 = martedì, ..., 6 = sabato, 7 = domenica
$dayOfWeek = (int) $date->format(´N´);
} while ($dayOfWeek > 5);
return $date;
}
// Esempi di utilizzo
$dates = [
new DateTimeImmutable(´2026-04-24´), // venerdì
new DateTimeImmutable(´2026-04-25´), // sabato
new DateTimeImmutable(´2026-04-26´), // domenica
new DateTimeImmutable(´2026-04-22´), // mercoledì
];
foreach ($dates as $date) {
$nextBusinessDay = getNextBusinessDay($date);
echo ´Data di partenza: ´ . $date->format(´Y-m-d´) . PHP_EOL;
echo ´Prossimo giorno feriale: ´ . $nextBusinessDay->format(´Y-m-d´) . PHP_EOL;
echo str_repeat(´-´, 30) . PHP_EOL;
}
/**
* Variante più flessibile:
* permette di escludere anche giorni festivi personalizzati.
*/
function getNextBusinessDayWithHolidays(
DateTimeImmutable $date,
array $holidays = []
): DateTimeImmutable {
do {
$date = $date->modify(´+1 day´);
$dayOfWeek = (int) $date->format(´N´);
$formattedDate = $date->format(´Y-m-d´);
} while ($dayOfWeek > 5 || in_array($formattedDate, $holidays, true));
return $date;
}
// Esempio con festività
$holidays = [
´2026-04-27´,
´2026-05-01´,
];
$startDate = new DateTimeImmutable(´2026-04-24´);
$result = getNextBusinessDayWithHolidays($startDate, $holidays);
echo ´Con festività: ´ . $result->format(´Y-m-d´) . PHP_EOL;
Spiegazione
Il cuore della soluzione è DateTimeImmutable. Questa classe è preferibile rispetto a DateTime quando vogliamo evitare modifiche involontarie: ogni operazione, come modify(´+1 day´), non cambia l’oggetto originale ma ne restituisce uno nuovo.
Perché usare il formato ´N´
Nel codice usiamo:
$dayOfWeek = (int) $date->format(´N´); Il formato N restituisce un numero da 1 a 7, dove 1 indica lunedì e 7 domenica. È molto comodo per controllare se il giorno è feriale, perché basta verificare se il valore è maggiore di 5.
Come funziona il ciclo do...while
La funzione avanza sempre di un giorno e poi controlla se la nuova data è un giorno lavorativo. Se non lo è, continua a incrementare. Questo approccio è semplice e leggibile, e funziona bene anche quando la data di partenza è venerdì, sabato o domenica.
Per esempio:
- da venerdì si passa a sabato, poi domenica, poi lunedì
- da sabato si passa a domenica, poi lunedì
- da domenica si passa direttamente a lunedì
- da mercoledì si passa a giovedì, che è feriale
Gestione delle festività
Nelle applicazioni reali, i giorni non lavorativi non sono solo sabato e domenica. Spesso bisogna escludere anche festività aziendali o nazionali. Per questo nella seconda funzione accettiamo un array di date in formato Y-m-d.
La verifica:
in_array($formattedDate, $holidays, true) usa il terzo parametro true per imporre un confronto rigoroso. È una buona pratica, perché evita confronti ambigui tra stringhe e altri tipi.
Esempio pratico di utilizzo
Immagina un sistema di assistenza clienti che deve inviare una mail di follow-up il giorno lavorativo successivo alla chiusura di un ticket. Se il ticket viene chiuso di venerdì sera, il follow-up non deve partire sabato, ma lunedì. In questo caso, la funzione appena vista risolve il problema in modo pulito.
Best practice
- Preferisci DateTimeImmutable quando vuoi evitare effetti collaterali e rendere il codice più sicuro.
- Usa formati standard come
Y-m-dper confrontare le date in modo affidabile. - Separa la logica: una funzione per i giorni feriali base, un’altra per le festività. In questo modo il codice resta più manutenibile.
- Evita numeri “magici”: se controlli il giorno della settimana, commenta bene il significato dei valori restituiti da
format(´N´). - Non assumere che il weekend sia uguale ovunque: in alcuni paesi il fine settimana può essere diverso. Se sviluppi software internazionale, rendi configurabile la lista dei giorni non lavorativi.
- Testa i casi limite: venerdì, sabato, domenica e giorni festivi consecutivi sono i casi più importanti da verificare.
Riepilogo
Calcolare il prossimo giorno feriale in PHP è un esercizio molto utile perché introduce una logica concreta e facilmente riutilizzabile in progetti reali. Con DateTimeImmutable ottieni un codice più sicuro, mentre con format(´N´) puoi distinguere rapidamente i giorni lavorativi dal weekend.
Il pattern base è semplice:
- parti da una data iniziale
- avanza di un giorno alla volta
- controlla se il giorno è tra lunedì e venerdì
- opzionalmente escludi anche le festività
Questa soluzione è ideale per notifiche, workflow automatici, scadenze aziendali e qualsiasi processo che debba rispettare il calendario lavorativo.
Approfondisci con risorse ufficiali
- PHP Manual - DateTimeImmutable: documentazione ufficiale della classe immutabile per date e orari.
- PHP Manual - DateTime::format: elenco completo dei formati supportati, incluso
N. - PHP Manual - DateTimeImmutable::modify: per capire come applicare modifiche relative alle date.
- PHP Manual - in_array: utile per confrontare date con una lista di festività o esclusioni.
