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): boolParametri
| Parametro | Descrizione |
|---|---|
$month | Il mese, come intero. Intervallo valido: 1–12. |
$day | Il giorno del mese. L'intervallo valido dipende dal mese e dall'anno — ad esempio, 30 è valido per aprile ma non per febbraio. |
$year | L'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 è):
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 >= 1Poiché 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-30Se 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.