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ámetro | Descripción |
|---|---|
$calendar | Calendario a usar: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH o CAL_FRENCH. |
$month | Número de mes en el calendario elegido (1–12 para gregoriano/juliano). |
$year | El 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:
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
13o0) genera una advertencia y devuelvefalse, no un conteo de días. Valida la entrada antes de llamar a la función. - Coerción de tipos:
falsees igual en sentido laxo a0. Usa una verificación estricta (if ($days === false)) en lugar deif (!$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]