W3docs

checkdate()

Scopri come checkdate() di PHP valida mese, giorno e anno come data gregoriana. Sintassi, parametri, anni bisestili ed esempi pratici.

Introduzione

La funzione checkdate() verifica se mese, giorno e anno formano insieme una data valida nel calendario gregoriano. È il modo più semplice in PHP per rispondere a domande come "Il 29 febbraio è una data reale quest'anno?" senza analizzare stringhe o costruire un oggetto DateTime.

Questa pagina tratta la sintassi, i parametri e il valore restituito di checkdate(), come gestisce gli anni bisestili e i valori fuori intervallo, il limite dell'intervallo degli anni e quando conviene usare la classe DateTime invece.

Sintassi

checkdate(int $month, int $day, int $year): bool

Parametri

ParametroDescrizione
$monthIl mese, come intero. Intervallo valido: 1–12.
$dayIl giorno del mese. L'intervallo valido dipende dal mese e dall'anno — ad esempio, 30 è valido per aprile ma non per febbraio.
$yearL'anno, come intero. Intervallo valido: 1–32767.

Valore restituito

checkdate() restituisce true quando la data è valida e false in caso contrario. La data è considerata valida quando sono vere tutte queste condizioni: il mese è compreso tra 1 e 12, l'anno è compreso tra 1 e 32767, e il giorno rientra nel numero di giorni che il mese dato ha nell'anno dato (gli anni bisestili vengono presi in considerazione).

Esempio di base

Per verificare se il 29 febbraio 2024 è una data valida (il 2024 è un anno bisestile, quindi lo è):

php— editable, runs on the server

Lo script memorizza il mese, il giorno e l'anno in variabili, li passa a checkdate() e stampa un messaggio in base al boolean restituito.

Anni bisestili e giorni non validi

Il vero vantaggio di checkdate() è che sa quanti giorni ha ogni mese, inclusa la regola degli anni bisestili per febbraio. Lo stesso numero di giorno può essere valido in un anno e non valido in quello successivo:

<?php

var_dump(checkdate(2, 29, 2024)); // bool(true)  — 2024 is a leap year
var_dump(checkdate(2, 29, 2023)); // bool(false) — 2023 is not
var_dump(checkdate(4, 31, 2024)); // bool(false) — April has only 30 days
var_dump(checkdate(13, 1, 2024)); // bool(false) — month out of range
var_dump(checkdate(0, 1, 2024));  // bool(false) — month must be >= 1

Poiché checkdate() esegue questi controlli autonomamente, non è necessario codificare manualmente quali mesi hanno 30 o 31 giorni.

Un utilizzo pratico: validare l'input dei form

Un uso comune di checkdate() è rifiutare date impossibili inviate tramite form prima di memorizzarle o costruire un oggetto DateTime:

<?php

function validateDate(int $month, int $day, int $year): string
{
    if (!checkdate($month, $day, $year)) {
        return "Please enter a real calendar date.";
    }

    return "Saved $year-$month-$day.";
}

echo validateDate(2, 30, 2024) . "\n"; // Please enter a real calendar date.
echo validateDate(12, 25, 2024) . "\n"; // Saved 2024-12-25.

Il limite dell'intervallo degli anni e l'alternativa DateTime

checkdate() accetta solo anni nell'intervallo 1–32767, il che va bene per la maggior parte delle applicazioni ma è inadatto se si hanno bisogno di date al di fuori di esso. Inoltre richiede tre interi separati, quindi occorre prima suddividere manualmente una stringa di data.

Per l'input come stringa o per una validazione più rigorosa, usa la classe DateTime di PHP. DateTime::createFromFormat() analizza una data in base a un formato personalizzato, e combinandola con DateTime::getLastErrors() è possibile rilevare i valori che PHP "trasla" silenziosamente (come trasformare il 30 febbraio in 1° o 2 marzo):

<?php

$input = '2024-02-30';
$date = DateTime::createFromFormat('Y-m-d', $input);
$errors = DateTime::getLastErrors();

if ($date === false || $errors['warning_count'] > 0 || $errors['error_count'] > 0) {
    echo "Invalid date: $input";
} else {
    echo "Valid date: " . $date->format('Y-m-d');
}
// Output: Invalid date: 2024-02-30

Se si dispone solo di mese, giorno e anno come interi, checkdate() è la scelta più breve e senza dipendenze.

Funzioni correlate

  • mktime() — crea un timestamp Unix dalle singole parti di una data.
  • date() — formatta un timestamp in una stringa di data leggibile.
  • strtotime() — analizza una data testuale in lingua inglese e la converte in un timestamp.
  • PHP Date and Time — panoramica sul lavoro con le date in PHP.

Conclusione

checkdate() è il modo più rapido per confermare che mese, giorno e anno formino una data gregoriana reale, con la gestione degli anni bisestili già inclusa. Tieni presente il limite dell'intervallo 1–32767 per gli anni e passa a DateTime::createFromFormat() quando devi validare stringhe di data o lavorare al di fuori di quell'intervallo.

Esercitazione

Pratica
Cosa può essere validato usando la funzione PHP checkdate()?
Cosa può essere validato usando la funzione PHP checkdate()?
Was this page helpful?