PHP准确计算给定DOB的最近年龄

时间:2011-08-28 00:57:36

标签: php date date-arithmetic

我正在尝试根据DOB计算最接近的年龄,但我无法理解如何做到这一点。我已经尝试了一些估算的方法,但这还不够好。我们需要计算今天和下一个生日的天数,无论是当年还是明年。并且还计算从今天和上一个生日的天数,无论是当年还是去年。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果我理解正确你想要“围绕”这个年龄?那么这些方面的内容如何:

$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');
}

答案 1 :(得分:1)

我认为这就是你想要的......当然,你可以让一个人的年龄精确到一天,然后将它向上或向下舍入到最接近的一年.....这可能是我应该拥有的完成。

这是相当暴力的,所以我相信你可以做得更好,但它做的是检查今年,明年和去年的生日(我分别检查这三个中的每一个而不是从365减去,因为date()负责闰年,我不想这样做。然后它从这些生日中最接近的一个计算年龄。

Working example

<?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

答案 2 :(得分:0)

编辑:重新编写以使用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;