Страница 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
У меня нет такого типа поля.
Re: Как расчитать возраст
Добавлено: 26 июн 2025, 11:03
Antonyous99
Извините, неточно написал.
В поле PHP код, там ваш код php вычисления, а новое текстовое поле делаете update результата.
Re: Как расчитать возраст
Добавлено: 26 июн 2025, 13:39
father
Antonyous99 писал(а): 26 июн 2025, 11:03
а новое текстовое поле делаете update результата.
Если честно не понял как работает эта часть. Так как в моём случае у данных типов полей
нет блока для вставки какого либо кода или текста. Только у типа поля Текст по шаблону возможна вставка id поля и обычный текст.
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;
}
}
}