我正在尝试根据DOB计算最接近的年龄,但我无法理解如何做到这一点。我已经尝试了一些估算的方法,但这还不够好。我们需要计算今天和下一个生日的天数,无论是当年还是明年。并且还计算从今天和上一个生日的天数,无论是当年还是去年。
有什么建议吗?
答案 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()负责闰年,我不想这样做。然后它从这些生日中最接近的一个计算年龄。
<?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;