Как расчитать возраст

Все вопросы/проблемы по установке и использовании.
father
Сообщения: 9
Зарегистрирован: 24 ноя 2024, 13:58
Имя: Денис
Откуда: Россия

Re: Как расчитать возраст

Сообщение father »

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;
        }
    }
}
Спасибо за вариант. Забрал в заметки.
remchik
Сообщения: 289
Зарегистрирован: 19 сен 2019, 11:32
Имя: Remchik
Откуда: Москва

Re: Как расчитать возраст

Сообщение remchik »

так создайте глобальную функцию, и юзайте ее сколько угодно раз
***
Тружусь как пчелка
***
SQL,BpmOnline,Creatio,BpmSoft,.NET,SAP WMS,MS SQL Server,Windows Server,IIS
Аватара пользователя
Fait
Инвестор
Инвестор
Сообщения: 1197
Зарегистрирован: 19 ноя 2020, 17:46
Имя: Максим Балакшеев
Откуда: Россия, Златоуст
Организация: ИП Балакшеев Максим Георгиевич
Контактная информация:

Re: Как расчитать возраст

Сообщение Fait »

Позвольте вставить свои 5 копеек)
Вот точный рабочий вариант расчёта возраста (цифра, сколько лет) с учётом времени UNIX (работает в поле MySQL формула).
Преимущества: можно применять в фильтрах и отчётах и сортировать записи по этому полю.
Минусы - нет месяцев и дней (да и зачем они, если важен именно возраст)
777 - ваше поле с датой рождения

Код: Выделить всё

IF([777]=0,'',
  IF([TODAY]>UNIX_TIMESTAMP(CONCAT(
      YEAR(FROM_UNIXTIME([TODAY],'%Y-%m-%d')),'-',
      MONTH(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [777] SECOND)),'-',
      DAY(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [777] SECOND)))),
    YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [TODAY] SECOND))-
    YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [777] SECOND))+1,
    YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [TODAY] SECOND))-
    YEAR(DATE_ADD(FROM_UNIXTIME(0), INTERVAL [777] SECOND))))
Ответить