W3docs

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): bool

Parámetros

ParámetroDescripción
$monthEl mes, como entero. Rango válido: 1–12.
$dayEl 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.
$yearEl 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):

php— editable, runs on the server

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 >= 1

Como 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-30

Si 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.

Práctica

Práctica
¿Qué se puede validar con la función PHP checkdate()?
¿Qué se puede validar con la función PHP checkdate()?
Was this page helpful?