PHP e date: calcolare correttamente il prossimo giorno feriale

by theArchitect
SHARE
PHP e date: calcolare correttamente il prossimo giorno feriale
© Guida-HTML5.it

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-d per 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.

SHARE