Страница 1 из 2

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

Добавлено: 25 июн 2025, 20:37
father
Задача рассчитать возраст и на выходе получить вот такой результат: 18 лет 3 месяца 15 дней
Я хотел это сделать так:
1. с помощью Разница в днях сколько дней прошло от сегодняшней даты
2. Данную цифру с помощью PHP раскладываю на нужный мне результат

Но так как PHP код это числовое поле, а результат нужен в виде текста у меня затык.
Поискал по форуму никто вроде не сталкивался с такой задачей.
Подскажите решение если оно есть.

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

Добавлено: 26 июн 2025, 01:49
Antonyous99
Так сделайте в том же поле PHP update в любое другое текстовое поле.
Примеры update есть в документации.
https://docs.rukovoditel.net.ru/index.php?p=125

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

Добавлено: 26 июн 2025, 08:33
father
У меня нет такого типа поля.
сущность3.jpg
сущность2.jpg
сущность.jpg

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

Добавлено: 26 июн 2025, 11:03
Antonyous99
Извините, неточно написал.
В поле PHP код, там ваш код php вычисления, а новое текстовое поле делаете update результата.

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

Добавлено: 26 июн 2025, 13:39
father
Antonyous99 писал(а): 26 июн 2025, 11:03 а новое текстовое поле делаете update результата.
Если честно не понял как работает эта часть. Так как в моём случае у данных типов полей
текст.jpg
нет блока для вставки какого либо кода или текста. Только у типа поля Текст по шаблону возможна вставка id поля и обычный текст.
текст по шаблону.jpg

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

Добавлено: 26 июн 2025, 14:37
Antonyous99
Слушайте, тут долго объяснять. Обращайтесь в телегу.

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

Добавлено: 26 июн 2025, 15:20
father
Понял, спасибо за попытку.

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

Добавлено: 27 июн 2025, 02:25
sajanagr
Можно на самом деле разными вариантами решить
если с помощью поля php код например у меня поле [1483] это дата рождения

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

// Получаем 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";
}

/**
 * Склонение русских слов в зависимости от числа
 * @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;
    }
}
также можно вообще с помощью поля MySQL формула

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

IF(
    [1483] IS NULL OR [1483] = '',
    NULL, -- Если дата рождения не заполнена, возвращаем NULL
    CONCAT(
        -- 1. Считаем количество полных лет с момента рождения до текущей даты
        TIMESTAMPDIFF(YEAR, FROM_UNIXTIME([1483]), CURDATE()),
        ' лет ',
        
        -- 2. Считаем количество полных месяцев после последнего "юбилея" (ДР)
        (
            TIMESTAMPDIFF(MONTH,
                DATE_ADD(FROM_UNIXTIME([1483]), 
                    INTERVAL TIMESTAMPDIFF(YEAR, FROM_UNIXTIME([1483]), CURDATE()) YEAR
                ),
                CURDATE()
            )
        ),
        ' месяцев ',
        
        -- 3. Считаем количество дней после последнего полного месяца
        -- Важно: вычитаем 1 день (особенно для дат 29, 30, 31 числа)
        DATEDIFF(
            CURDATE(),
            DATE_ADD(
                DATE_ADD(FROM_UNIXTIME([1483]), 
                    INTERVAL TIMESTAMPDIFF(YEAR, FROM_UNIXTIME([1483]), CURDATE()) YEAR
                ),
                INTERVAL TIMESTAMPDIFF(MONTH,
                    DATE_ADD(FROM_UNIXTIME([1483]), 
                        INTERVAL TIMESTAMPDIFF(YEAR, FROM_UNIXTIME([1483]), CURDATE()) YEAR
                    ),
                    CURDATE()
                ) MONTH
            )
        ) - 1,
        ' дней'
    )
)
при использовании поля PHP код более красиво, что можно с правильным склонением для лет, месяцев и дней делать

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

Добавлено: 30 июн 2025, 20:21
father
sajanagr писал(а): 27 июн 2025, 02:25 Можно на самом деле разными вариантами решить
Да, рабочий вариант я с помощью PHP и решил свою задачу. Спасибо.

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

Добавлено: 30 июл 2025, 12:45
sajanagr
father писал(а): 30 июн 2025, 20:21
sajanagr писал(а): 27 июн 2025, 02:25 Можно на самом деле разными вариантами решить
Да, рабочий вариант я с помощью PHP и решил свою задачу. Спасибо.
Небольшое дополнение: если этот код использовать в нескольких полях типа PHP-код, может появиться ошибка:
Fatal error: Cannot redeclare getNounPluralForm() ...
Это связано с тем, что PHP не позволяет объявлять одну и ту же функцию несколько раз. Чтобы избежать этой ошибки, нужно добавить проверку function_exists.

Вот исправленный вариант для поля с возрастом:

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

// Получаем 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;
        }
    }
}