checkdate()
Wie PHP's checkdate() Monat, Tag und Jahr als Gregorianisches Datum prüft. Syntax, Parameter, Schaltjahre und Beispiele.
Einführung
Die Funktion checkdate() prüft, ob Monat, Tag und Jahr zusammen ein gültiges Datum im Gregorianischen Kalender bilden. Sie ist der einfachste Weg in PHP, eine Frage wie „Ist der 29. Februar in diesem Jahr ein gültiges Datum?" zu beantworten, ohne Zeichenketten zu parsen oder ein DateTime-Objekt zu erstellen.
Diese Seite behandelt die Syntax, Parameter und den Rückgabewert von checkdate(), wie sie mit Schaltjahren und ungültigen Werten umgeht, ihre Jahresbereichsbegrenzung und wann stattdessen die Klasse DateTime verwendet werden sollte.
Syntax
checkdate(int $month, int $day, int $year): boolParameter
| Parameter | Beschreibung |
|---|---|
$month | Der Monat als Ganzzahl. Gültiger Bereich: 1–12. |
$day | Der Tag des Monats. Der gültige Bereich hängt vom Monat und Jahr ab — zum Beispiel ist 30 für April gültig, aber nicht für Februar. |
$year | Das Jahr als Ganzzahl. Gültiger Bereich: 1–32767. |
Rückgabewert
checkdate() gibt true zurück, wenn das Datum gültig ist, andernfalls false. Das Datum gilt als gültig, wenn alle folgenden Bedingungen erfüllt sind: der Monat liegt zwischen 1 und 12, das Jahr liegt zwischen 1 und 32767, und der Tag liegt im Bereich der Tage, die der angegebene Monat im angegebenen Jahr hat (Schaltjahre werden berücksichtigt).
Grundlegendes Beispiel
So prüfen Sie, ob der 29. Februar 2024 ein gültiges Datum ist (2024 ist ein Schaltjahr, also ja):
Das Skript speichert Monat, Tag und Jahr in Variablen, übergibt sie an checkdate() und gibt anhand des zurückgegebenen boolean-Werts eine Meldung aus.
Schaltjahre und ungültige Tage
Der eigentliche Wert von checkdate() besteht darin, dass sie weiß, wie viele Tage jeder Monat hat — einschließlich der Schaltjahrregel für Februar. Dieselbe Tageszahl kann in einem Jahr gültig und im nächsten ungültig sein:
<?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 >= 1Da checkdate() diese Prüfungen selbst durchführt, müssen Sie nicht hart kodieren, welche Monate 30 oder 31 Tage haben.
Praktische Anwendung: Formulareingaben validieren
Ein häufiger Einsatz von checkdate() ist das Ablehnen unmöglicher Datumsangaben aus einem Formular, bevor diese gespeichert oder ein DateTime-Objekt erstellt wird:
<?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.Die Jahresbereichsbegrenzung und die DateTime-Alternative
checkdate() akzeptiert nur Jahre im Bereich 1–32767, was für die meisten Anwendungen ausreicht, aber ungeeignet ist, wenn Sie Datumsangaben außerhalb dieses Bereichs benötigen. Außerdem erwartet sie drei separate Ganzzahlen, sodass Sie eine Datumszeichenkette zunächst selbst aufteilen müssen.
Für Zeichenketteneingaben oder strengere Validierung verwenden Sie PHP's Klasse DateTime. DateTime::createFromFormat() parst ein Datum anhand eines benutzerdefinierten Formats, und in Kombination mit DateTime::getLastErrors() können Sie Werte erkennen, die PHP stillschweigend „überschlägt" (zum Beispiel wird der 30. Februar zu dem 1. oder 2. März):
<?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-30Wenn Sie nur Monat, Tag und Jahr als Ganzzahlen vorliegen haben, ist checkdate() die kürzere, abhängigkeitsfreie Wahl.
Verwandte Funktionen
mktime()— einen Unix-Timestamp aus einzelnen Datumsteilen erstellen.date()— einen Timestamp in eine lesbare Datumszeichenkette formatieren.strtotime()— ein englisches Datumstextformat in einen Timestamp umwandeln.- PHP Datum und Uhrzeit — Übersicht über die Arbeit mit Datumsangaben in PHP.
Fazit
checkdate() ist der schnellste Weg zu bestätigen, dass Monat, Tag und Jahr ein echtes Gregorianisches Datum bilden, wobei Schaltjahre automatisch berücksichtigt werden. Beachten Sie die Jahresbegrenzung von 1–32767, und wechseln Sie zu DateTime::createFromFormat(), wenn Sie Datumszeichenketten validieren oder außerhalb dieses Bereichs arbeiten müssen.