PHP точно рассчитать ближайший возраст для данной DOB - PullRequest
3 голосов
/ 28 августа 2011

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

Есть предложения?

Ответы [ 3 ]

1 голос
/ 28 августа 2011

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

Это довольно грубая сила, так что я уверен, что вы можете сделать это лучше, но то, что он делает, это проверяет количество дней до этого года, следующего года и прошлогоднего дня рождения (я проверил каждый из этих трех отдельно вместо вычитая из 365, поскольку date () заботится о високосных годах , а я не хочу). Затем он вычисляет возраст, исходя из того, какой из этих дней рождения ближе всего.

Рабочий пример

<?php
$bday = "September 3, 1990";
// Output is 21 on 2011-08-27 for 1990-09-03

// Check the times until this, next, and last year's bdays
$time_until = strtotime(date('M j', strtotime($bday))) - time();
$this_year = abs($time_until);

$time_until = strtotime(date('M j', strtotime($bday)).' +1 year') - time();
$next_year = abs($time_until);

$time_until = strtotime(date('M j', strtotime($bday)).' -1 year') - time();
$last_year = abs($time_until);

$years = array($this_year, $next_year, $last_year);

// Calculate age based on closest bday
if (min($years) == $this_year) {
    $age = date('Y', time()) - date('Y', strtotime($bday));
}
if (min($years) == $next_year) {
    $age = date('Y', strtotime('+1 year')) - date('Y', strtotime($bday));
}
if (min($years) == $last_year) {
    $age = date('Y', strtotime('-1 year')) - date('Y', strtotime($bday));
}

echo "You are $age years old.";
?>

Редактировать: удалены ненужные date() с в $time_until кальках.

1 голос
/ 28 августа 2011

Если я правильно понимаю, вы хотите "округлить" возраст? Тогда как насчет чего-то такого:

$dob = new DateTime($birthday);
$diff = $dob->diff(new DateTime);

if ($diff->format('%m') > 6) {
    echo 'Age: ' . ($diff->format('%y') + 1);
} else {
    echo 'Age: ' . $diff->format('%y');
}
0 голосов
/ 28 августа 2011

Редактировать: переписано для использования DateInterval

Это должно помочь тебе ...

$birthday = new DateTime('1990-09-03');
$today = new DateTime();
$diff = $birthday->diff($today, TRUE);
$age = $diff->format('%Y');
$next_birthday = $birthday->modify('+'. $age + 1 . ' years');
$halfway_to_bday = $next_birthday->sub(DateInterval::createFromDateString('182 days 12 hours'));

if($today >= $halfway_to_bday)
{
    $age++;
}

echo $age;
...