checkdate()
Apprenez comment PHP checkdate() valide un mois, un jour et une année comme date grégorienne. Syntaxe, paramètres, années bissextiles et exemples.
Introduction
La fonction checkdate() vérifie si un mois, un jour et une année forment ensemble une date valide dans le calendrier grégorien. C'est la manière la plus simple en PHP de répondre à une question comme « Le 29 février est-il une date réelle cette année ? » sans analyser des chaînes de caractères ni construire un objet DateTime.
Cette page couvre la syntaxe, les paramètres et la valeur de retour de checkdate(), la façon dont elle gère les années bissextiles et les valeurs hors limites, sa limite d'intervalle pour les années, et quand utiliser la classe DateTime à la place.
Syntaxe
checkdate(int $month, int $day, int $year): boolParamètres
| Paramètre | Description |
|---|---|
$month | Le mois, sous forme d'entier. Plage valide : 1–12. |
$day | Le jour du mois. La plage valide dépend du mois et de l'année — par exemple, 30 est valide pour avril mais pas pour février. |
$year | L'année, sous forme d'entier. Plage valide : 1–32767. |
Valeur de retour
checkdate() retourne true si la date est valide et false dans le cas contraire. La date est considérée comme valide lorsque toutes ces conditions sont remplies : le mois est compris entre 1 et 12, l'année est comprise entre 1 et 32767, et le jour est dans le nombre de jours que le mois donné possède pour l'année donnée (les années bissextiles sont prises en compte).
Exemple de base
Pour vérifier si le 29 février 2024 est une date valide (2024 est une année bissextile, donc oui) :
Le script stocke le mois, le jour et l'année dans des variables, les passe à checkdate() et affiche un message basé sur le boolean qu'elle retourne.
Années bissextiles et jours invalides
La vraie valeur de checkdate() est qu'elle connaît le nombre de jours de chaque mois — y compris la règle des années bissextiles pour février. Le même numéro de jour peut être valide une année et invalide l'année suivante :
<?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 >= 1Puisque checkdate() effectue ces vérifications elle-même, vous n'avez pas à coder en dur quels mois ont 30 ou 31 jours.
Un cas pratique : valider les données d'un formulaire
Un usage courant de checkdate() est de rejeter les dates impossibles soumises via un formulaire avant de les stocker ou de construire un objet 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.La limite d'intervalle des années et l'alternative DateTime
checkdate() n'accepte que les années dans la plage 1–32767, ce qui convient à la plupart des applications mais ne convient pas si vous avez besoin de dates en dehors de cet intervalle. Elle prend également trois entiers séparés, ce qui vous oblige à découper vous-même une chaîne de date au préalable.
Pour les entrées sous forme de chaîne ou une validation plus stricte, utilisez la classe DateTime de PHP. DateTime::createFromFormat() analyse une date selon un format personnalisé, et en la combinant avec DateTime::getLastErrors(), vous pouvez détecter les valeurs que PHP « reporte » silencieusement (comme transformer le 30 février en 1er ou 2 mars) :
<?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-30Si vous disposez uniquement du mois, du jour et de l'année sous forme d'entiers, checkdate() est le choix le plus court et sans dépendances.
Fonctions associées
mktime()— construire un horodatage Unix à partir de composantes de date individuelles.date()— formater un horodatage en une chaîne de date lisible.strtotime()— analyser une date textuelle en anglais en un horodatage.- PHP Date and Time — vue d'ensemble du travail avec les dates en PHP.
Conclusion
checkdate() est le moyen le plus rapide de confirmer qu'un mois, un jour et une année forment une vraie date grégorienne, avec la gestion des années bissextiles intégrée. Gardez à l'esprit sa limite d'années 1–32767 et passez à DateTime::createFromFormat() lorsque vous avez besoin de valider des chaînes de date ou de travailler en dehors de cet intervalle.