checkdate()
Aprende cómo checkdate() de PHP valida un mes, día y año como fecha gregoriana. Incluye sintaxis, parámetros, años bisiestos y ejemplos.
Introducción
La función checkdate() comprueba si un mes, un día y un año forman juntos una fecha válida en el calendario gregoriano. Es la forma más sencilla en PHP de responder a preguntas como "¿Es el 29 de febrero una fecha real este año?" sin necesidad de analizar cadenas ni construir un objeto DateTime.
Esta página cubre la sintaxis, los parámetros y el valor de retorno de checkdate(), cómo maneja los años bisiestos y los valores fuera de rango, su límite de rango de años, y cuándo conviene usar la clase DateTime en su lugar.
Sintaxis
checkdate(int $month, int $day, int $year): boolParámetros
| Parámetro | Descripción |
|---|---|
$month | El mes, como entero. Rango válido: 1–12. |
$day | El día del mes. El rango válido depende del mes y del año — por ejemplo, 30 es válido para abril pero no para febrero. |
$year | El año, como entero. Rango válido: 1–32767. |
Valor de retorno
checkdate() devuelve true cuando la fecha es válida y false en caso contrario. La fecha se considera válida cuando todas estas condiciones se cumplen: el mes está entre 1 y 12, el año está entre 1 y 32767, y el día se encuentra dentro del número de días que tiene el mes indicado en el año indicado (teniendo en cuenta los años bisiestos).
Ejemplo básico
Para comprobar si el 29 de febrero de 2024 es una fecha válida (2024 es un año bisiesto, así que sí lo es):
El script almacena el mes, el día y el año en variables, los pasa a checkdate() e imprime un mensaje según el boolean que devuelve.
Años bisiestos y días inválidos
El verdadero valor de checkdate() es que conoce cuántos días tiene cada mes, incluyendo la regla del año bisiesto para febrero. El mismo número de día puede ser válido en un año e inválido en el siguiente:
<?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 >= 1Como checkdate() realiza estas comprobaciones por sí misma, no es necesario codificar manualmente qué meses tienen 30 o 31 días.
Un uso práctico: validar datos de formulario
Una tarea habitual para checkdate() es rechazar fechas imposibles enviadas desde un formulario antes de almacenarlas o construir un objeto 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.El límite de rango de años y la alternativa DateTime
checkdate() solo acepta años en el rango 1–32767, lo cual es adecuado para la mayoría de aplicaciones pero no es válido si se necesitan fechas fuera de ese rango. Además, requiere tres enteros separados, por lo que primero hay que dividir manualmente una cadena de fecha.
Para entradas de tipo string o una validación más estricta, usa la clase DateTime de PHP. DateTime::createFromFormat() analiza una fecha según un formato personalizado, y combinarlo con DateTime::getLastErrors() permite detectar valores que PHP "desplaza" silenciosamente (como convertir el 30 de febrero en el 1 o 2 de 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-30Si solo dispones de mes, día y año como enteros, checkdate() es la opción más corta y sin dependencias.
Funciones relacionadas
mktime()— construye un timestamp Unix a partir de partes individuales de una fecha.date()— formatea un timestamp como una cadena de fecha legible por humanos.strtotime()— analiza una fecha textual en inglés y la convierte en un timestamp.- PHP Date and Time — resumen sobre el trabajo con fechas en PHP.
Conclusión
checkdate() es la forma más rápida de confirmar que un mes, un día y un año forman una fecha gregoriana real, con los años bisiestos gestionados automáticamente. Ten en cuenta su límite de años (1–32767) y pasa a DateTime::createFromFormat() cuando necesites validar cadenas de fecha o trabajar fuera de ese rango.