datetime — вопрос расчета возраста високосного года в переполнении стека

Я использую следующую функцию для расчета возраста с заданной даты рождения, но она не показывает правильную разницу, если используется день високосного года, т.е. 29. Пожалуйста, помогите мне исправить этот код.

<?php
function getAbsAge($birthday)
{
list($year,$month,$day) = explode("-", $birthday);
$year_diff  = date("Y") - $year;
$month_diff = date("m") - $month;
$day_diff   = date("d") - $day;

if ($day_diff < 0 || $month_diff < 0)
{
$year_diff--;
}

if ($year_diff == 0)
{
$interval = date_diff(date_create(), date_create($birthday));
$months = $interval->format("%M");
$days = $interval->format("%d");

if ($months > 0)
{
return $interval->format("%M Months %d Days");
}
else if ($months == 0 && $days > 1)
{
return $interval->format("%d Days");
}
else
{
return $interval->format("%d Day");
}
}
else if ($year_diff == 1)
{
return "$year_diff Year";
}
else if ($year_diff > 1)
{
return "$year_diff Years";
}
}
echo getAbsAge("2012-02-29")
?>

Также, если кто-то может предложить лучший код, пожалуйста, обновите его.

Мне нужно найти дату рождения в месяцах и днях, если человеку меньше 1 года.

У меня последняя версия 5.4 php на моем сервере.

С 2012-02-29, его возвращение 2 года, тогда как это должно быть 3 года. Пожалуйста помоги.

-1

Решение

Почему вы не используете date_diff() функционировать весь путь до конца? это даст вам желаемый результат:

function getAbsAge($birthday) {

$age = '';
$diff = date_diff(date_create(), date_create($birthday));
$years = $diff->format("%y");
$months = $diff->format("%m");
$days = $diff->format("%d");

if ($years) {
$age = ($years < 2) ? '1 Year' : "$years Years";
} else {
$age = '';
if ($months) $age .= ($months < 2) ? '1 Month ' : "$months Months ";
if ($days) $age .= ($days < 2) ? '1 Day' : "$months Days";
}
return trim($age);
}

Другой способ — вычислить разницу во времени в секундах и взять ее оттуда:

list($year,$month,$day) = explode("-", $birthday);
$diff = mktime(0,0,0,date('n'),date('j'),date('Y')) - mktime(0,0,0,$month,$day,$year);

Затем день состоит из 24 часов по 60 минут каждый по 60 секунд:

$sday = 60 * 60 * 24;

И тогда вычисление разницы в годах будет:

$years = floor($diff / (365.2425 * $sday));

Но я бы просто придерживался первой версии, которую я вам представил, используя date_diff()

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]