cal_days_in_month()
Функция cal_days_in_month() в PHP возвращает количество дней в месяце для заданного календаря, месяца и года.
Функция PHP cal_days_in_month() возвращает количество дней в месяце для заданного календаря, месяца и года. Поскольку она учитывает високосные годы и различные календарные системы, она надёжнее, чем хранение фиксированных значений или ручной расчёт с учётом високосного года. На этой странице описаны её сигнатура, рабочие примеры (включая високосные годы и юлианский календарь), распространённые ошибки и обычная альтернатива при недоступном расширении Calendar.
Синтаксис
cal_days_in_month(int $calendar, int $month, int $year): int| Параметр | Описание |
|---|---|
$calendar | Используемый календарь: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH или CAL_FRENCH. |
$month | Номер месяца в выбранном календаре (1–12 для григорианского/юлианского). |
$year | Год в виде целого числа. |
Функция возвращает количество дней в виде int. cal_days_in_month() входит в состав расширения Calendar, которое поставляется в комплекте с PHP, но должно быть включено (по умолчанию оно включено в большинстве сборок). Если расширение отсутствует, функция не существует; см. Без расширения Calendar ниже.
Базовое использование
Передайте константу календаря, месяц и год:
Будет напечатано There are 31 days in January 2022.
Обработка високосных лет
Функция автоматически учитывает високосные годы, поэтому февраль возвращает 28 или 29 без какой-либо дополнительной логики с вашей стороны:
<?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
?>Перечисление каждого месяца в году
Распространённая задача — построение календаря или выпадающего списка дат. Переберите 12 месяцев в цикле:
<?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";
}
?>Для 2024 года (високосного) будет напечатано February 2024: 29 days, а все остальные месяцы покажут своё обычное количество дней.
Использование другого календаря
Изменение первого аргумента переключает календарную систему. Юлианский календарь, например, считает 1900 год високосным, тогда как григорианский — нет:
<?php
echo cal_days_in_month(CAL_JULIAN, 2, 1900); // 29
echo "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 1900); // 28
?>Распространённые ошибки
- Недопустимый месяц или год: передача месяца за пределами допустимого диапазона (например,
13или0) вызывает предупреждение и возвращаетfalse, а не количество дней. Проверяйте входные данные перед вызовом функции. - Приведение типов:
falseусловно равно0. Используйте строгую проверку (if ($days === false)), а неif (!$days)при обработке ошибок. - Зависимость от расширения: функция существует только при загруженном расширении Calendar. В переносимом коде используйте
function_exists('cal_days_in_month').
Без расширения Calendar
Если расширение Calendar недоступно, класс DateTime (всегда доступен) даёт тот же результат для григорианского календаря с помощью формата t, который возвращает количество дней в месяце:
<?php
$date = new DateTime('2024-02-01');
echo $date->format('t'); // 29
?>Это наиболее переносимый вариант для григорианского календаря, не требующий дополнительных расширений.
Заключение
cal_days_in_month() возвращает количество дней в месяце для заданного календаря и года, автоматически обрабатывая високосные годы и несколько календарных систем. Используйте её, когда работаете с расширением Calendar или нужен негригорианский календарь; в противном случае DateTime::format('t') является альтернативой без зависимостей.
Для продолжения работы с датами в PHP смотрите PHP Date and Time и функцию checkdate() для проверки григорианских дат.
Диаграмма
graph LR
A[Input Calendar Type, Month, and Year] -- cal_days_in_month --> B[Output Number of Days]