В алгоритмах: Как правильно рассчитать количество дней в феврале с учетом високосного года в PHP (проверка кратности 4, 100 и 400)?
Определение количества дней в феврале — классическая задача, требующая корректной реализации алгоритма проверки високосного года. Григорианский календарь устанавливает следующие правила: год является високосным, если он кратен 4, НО не кратен 100, ИЛИ кратен 400. Февраль в високосный год содержит 29 дней, в обычный — 28.
**Алгоритм проверки на PHP**
Самый прозрачный способ — реализовать логику вручную:
php
function isLeapYear(int $year): bool {
return ($year % 4 === 0 && $year % 100 !== 0) || ($year % 400 === 0);
}
function getDaysInFebruary(int $year): int {
return isLeapYear($year) ? 29 : 28;
}
// Пример использования
$year = 2024;
echo getDaysInFebruary($year); // Выведет: 29
**Разбор логики**
— `$year % 4 === 0` — год делится на 4 (базовое условие).
— `$year % 100 !== 0` — исключаем вековые годы (1900 — не високосный).
— `$year % 400 === 0` — возвращаем вековые годы, кратные 400 (2000 — високосный).
Примеры:
— 2024: делится на 4, не делится на 100 → **29 дней**
— 1900: делится на 100, не делится на 400 → **28 дней**
— 2000: делится на 400 → **29 дней**
— 2023: не делится на 4 → **28 дней**
**Встроенные функции PHP**
PHP предоставляет готовые инструменты, которые избавляют от ручной реализации:
php
// Способ 1: через date()
$days = (int) date(‘t’, mktime(0, 0, 0, 2, 1, $year));
// Способ 2: через DateTime
$date = new DateTime(«{$year}-02-01»);
$days = (int) $date->format(‘t’);
// Способ 3: через checkdate и cal_days_in_month
$days = cal_days_in_month(CAL_GREGORIAN, 2, $year);
Функция `date(‘t’, …)` возвращает количество дней в месяце для указанной временной метки. Это наиболее лаконичный и надёжный способ.
**Рекомендации**
1. Для production-кода предпочтительнее использовать встроенные функции PHP — они учитывают все edge cases.
2. Ручная реализация полезна для понимания алгоритма и в учебных целях.
3. При работе с датами до 1970 года используйте класс `DateTime`, а не `mktime`, чтобы избежать проблем с Unix timestamp.
4. Всегда валидируйте входной год (должен быть положительным целым числом).
Таким образом, корректная проверка високосного года требует трёхступенчатой проверки делимости, и PHP предоставляет как инструменты для ручной реализации, так и готовые встроенные решения.
