Re: Как расчитать возраст
Добавлено: 30 июл 2025, 13:18
Спасибо за вариант. Забрал в заметки.sajanagr писал(а): 30 июл 2025, 12:45 Вот исправленный вариант для поля с возрастом:Код: Выделить всё
// Получаем Unix timestamp даты рождения из поля [1483] $birthday_timestamp = [1483]; // Если дата рождения не указана, возвращаем пустую строку if (empty($birthday_timestamp)) { $output_value = ''; } else { // Создаём объект даты рождения $birthday = new DateTime(); $birthday->setTimestamp($birthday_timestamp); // Создаём объект текущей даты и явно устанавливаем время в полночь (чтобы совпадало с MySQL) $today = new DateTime(); $today->setTime(0, 0, 0); // Вычисляем разницу между датами $diff = $today->diff($birthday); // Получаем количество полных лет, месяцев и дней $years = $diff->y; $months = $diff->m; $days = $diff->d; // Формируем строку с правильным склонением для лет, месяцев и дней $years_text = $years . ' ' . getNounPluralForm($years, 'год', 'года', 'лет'); $months_text = $months . ' ' . getNounPluralForm($months, 'месяц', 'месяца', 'месяцев'); $days_text = $days . ' ' . getNounPluralForm($days, 'день', 'дня', 'дней'); // Итоговая строка $output_value = "$years_text $months_text $days_text"; } if (!function_exists('getNounPluralForm')) { /** * Склонение русских слов в зависимости от числа * @param int $number - число * @param string $one - форма для 1 (год/месяц/день) * @param string $two - форма для 2,3,4 (года/месяца/дня) * @param string $five - форма для 5 и больше, а также 11-19 (лет/месяцев/дней) * @return string */ function getNounPluralForm(int $number, string $one, string $two, string $five): string { $mod100 = $number % 100; if ($mod100 >= 11 && $mod100 <= 19) { return $five; } $mod10 = $number % 10; switch ($mod10) { case 1: return $one; case 2: case 3: case 4: return $two; default: return $five; } } }