Вычислить возраст в годах и днях PHP

#php #date #time #converters #calculation

#php #Дата #время #конвертеры #вычисление

Вопрос:

Я знаю, что об этом спрашивали много раз на протяжении многих лет, но я все еще получаю результаты, отличные от того, что, по моему мнению, должно быть правильным. У меня есть следующий код, который вычисляет количество дней между двумя датами, а затем преобразует его в годы и дни. Когда я конвертирую, результат не тот, который я ожидаю. Смотрите ниже. Пожалуйста, дайте мне знать, что неверно, это действительно расстраивает.

Спасибо!

 $born = '1985-09-09';
$date = date('Y-m-d H:i:s'); // this is today's date
$birthdate = new DateTime("$born");
$today = new DateTime("$date");

$diff = $today->diff($birthdate)->format("%a");

$days = $diff;
$years_remaining = intval($days / 365); //divide by 365 and throw away the remainder
$days_remaining = $days % 365;    

echo "<b>Age:</b> ".$years_remaining."y-".$days_remaining."d<br />";
  

Что я хочу отобразить:
Возраст: 35y-0d

Но что я получаю: Возраст: 35y-9d

Комментарии:

1. просто сделайте $days_remaining = 0 не думаете ли вы, что это решит проблему, если ваша единственная цель — показывать только годы. А не точный год дни?

2. это совпадение, что дата рождения и текущая дата являются -09 , и у вас остается 9 дней? Что произойдет, если вы используете, например, born as 1985-09-13 и current date as 2020-09-15 ? Также вы можете сделать new DateTime($born) — переменные уже являются строками.

3. Год не всегда состоит из 365 дней, там было несколько високосных дней (около… 9?).

4. Там были високосные годы, есть ли способ выполнить расчет, чтобы учесть это? Я подумал, что, возможно, функции PHP были. Очевидно, что нет. Я хочу показать дни. Это всего лишь один пример, я просто случайно использовал сегодняшнюю дату.

5. Да, я просто случайно выбрал today, потому что это для моего баскетбольного сайта, и у игрока сегодня день рождения. Но это неправильно на 7 или 8 дней для всех остальных тоже.

Ответ №1:

Поскольку високосные годы содержат 366 дней, вы не можете просто разделить days / 365:

 <?php
$born = '1985-09-05';
$date = date('Y-m-d H:i:s'); // this is today's date
$birthdate = new DateTime("$born");
$today = new DateTime("$date");

// get diff in full years
$diff_years = $today->diff($birthdate)->format("%y");

// add years diff to birthday, (so here your last birthday date)
$birthdate->add(new DateInterval("P{$diff_years}Y"));

// count days since your last birthday party day
$diff_days = $today->diff($birthdate)->format("%a");

echo "Age: ".$diff_years."y and ".$diff_days." days ";
  

Здесь вы можете попробовать живой PHP-код

Комментарии:

1. Большое вам спасибо, вот и все!!! Действительно ценю! Я просто понятия не имел, как справиться с частью високосного года.