W3docs

cal_days_in_month()

Aprende a usar cal_days_in_month() en PHP para obtener los días de un mes en distintos sistemas de calendario, con ejemplos y alternativas.

La función PHP cal_days_in_month() devuelve el número de días de un mes para un calendario, mes y año determinados. Al comprender los años bisiestos y los distintos sistemas de calendario, es más confiable que codificar el conteo de días manualmente o calcular a mano si un año es bisiesto. Esta página cubre su firma, ejemplos de uso (incluyendo años bisiestos y el calendario juliano), errores comunes y la alternativa cotidiana cuando la extensión Calendar no está disponible.

Sintaxis

cal_days_in_month(int $calendar, int $month, int $year): int
ParámetroDescripción
$calendarCalendario a usar: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH o CAL_FRENCH.
$monthNúmero de mes en el calendario elegido (112 para gregoriano/juliano).
$yearEl año, como un entero.

Devuelve el número de días como un int. cal_days_in_month() forma parte de la extensión Calendar, que viene incluida con PHP pero debe estar habilitada (lo está por defecto en la mayoría de las compilaciones). Si la extensión no está disponible, la función no existe; consulta Sin la extensión Calendar más adelante.

Uso básico

Pasa la constante del calendario, el mes y el año:

php— editable, runs on the server

Esto imprime There are 31 days in January 2022.

Manejo de años bisiestos

La función tiene en cuenta automáticamente los años bisiestos, por lo que febrero devuelve 28 o 29 sin ninguna lógica adicional de tu parte:

<?php
echo cal_days_in_month(CAL_GREGORIAN, 2, 2020); // 29 — 2020 is a leap year
echo "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 2023); // 28 — 2023 is not
?>

Listar todos los meses de un año

Una tarea común es construir un calendario o un menú desplegable de fechas. Itera sobre los 12 meses:

<?php
$year = 2024;
$names = ['January', 'February', 'March', 'April', 'May', 'June',
          'July', 'August', 'September', 'October', 'November', 'December'];

for ($month = 1; $month <= 12; $month++) {
    $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    echo "{$names[$month - 1]} $year: $days days\n";
}
?>

Para 2024 (un año bisiesto) esto imprime February 2024: 29 days, mientras que el resto de los meses muestra su conteo habitual.

Usar un calendario diferente

Cambiar el primer argumento modifica el sistema de calendario. El calendario juliano, por ejemplo, trata 1900 como año bisiesto, mientras que el calendario gregoriano no lo hace:

<?php
echo cal_days_in_month(CAL_JULIAN, 2, 1900);    // 29
echo "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 1900); // 28
?>

Errores comunes

  • Mes o año inválido: pasar un mes fuera del rango válido (por ejemplo 13 o 0) genera una advertencia y devuelve false, no un conteo de días. Valida la entrada antes de llamar a la función.
  • Coerción de tipos: false es igual en sentido laxo a 0. Usa una verificación estricta (if ($days === false)) en lugar de if (!$days) al manejar errores.
  • Dependencia de la extensión: la función solo existe cuando la extensión Calendar está cargada. Protégela con function_exists('cal_days_in_month') en código portable.

Sin la extensión Calendar

Si la extensión Calendar no está disponible, la clase DateTime (siempre disponible) ofrece el mismo resultado gregoriano mediante el carácter de formato t, que representa el número de días del mes:

<?php
$date = new DateTime('2024-02-01');
echo $date->format('t'); // 29
?>

Esta es la opción más portable para el calendario gregoriano y no necesita ninguna extensión adicional.

Conclusión

cal_days_in_month() devuelve el conteo de días de un mes en un calendario y año determinados, gestionando los años bisiestos y múltiples sistemas de calendario por ti. Úsala cuando trabajes con la extensión Calendar o necesites un calendario no gregoriano; de lo contrario, DateTime::format('t') es una alternativa sin dependencias.

Para continuar trabajando con fechas en PHP, consulta PHP Date and Time y la función checkdate() para validar una fecha gregoriana.

Diagrama

graph LR
A[Input Calendar Type, Month, and Year] -- cal_days_in_month --> B[Output Number of Days]

Práctica

Práctica
What does the cal_days_in_month() function in PHP do?
What does the cal_days_in_month() function in PHP do?
Was this page helpful?