用PHP计算出生日期的年龄

4

你遇到的最精确的从用户出生日期计算年龄的函数是什么?我有以下代码,想知道如何改进它,因为它不支持所有日期格式,而且也不确定它是否是最准确的函数(符合DateTime标准会更好)。

function getAge($birthday) {
    return floor((strtotime(date('d-m-Y')) - strtotime($date))/(60*60*24*365.2421896));
}

this? - Milan Halada
4
这个函数对你有用吗?嗯?看起来这个函数计算年龄时没有考虑 $birthday - Hardik Patel
这个年龄是整数岁吗? - Femi
可能是重复的问题:PHP计算年龄 - Alix Axel
10个回答

14
$birthday = new DateTime($birthday);
$interval = $birthday->diff(new DateTime);
echo $interval->y;

应该可以工作


1
“it doesn't” 不是错误信息。另外,特别是第一行的工作高度取决于 $date 的格式。http://php.net/datetime.createfromformat -- 我刚测试过了:完美运行。 - KingCrunch
这种方法的一个问题是:例如,如果今天是2014年9月23日;对于一个在1988年9月20日出生的人,它将返回26岁,但对于一个在1988年9月25日出生的人,它将返回25岁。尽管从技术上讲这是正确的,但这可能不是预期的答案。由于我们只显示年份,所以这会产生很大的差异。这可能就是为什么它对@user955822无效的原因。在计算年龄之前,确定“出生日期”始终是一个好习惯。 - Jayarathina Madharasan
@JayarathinaMadharasan 我不同意。询问一个人的年龄是指他/她的实际年龄,这种情况下如果他/她不是26岁,则26岁是错误的。我的意思是:这不仅在技术上是正确的,而且在整个日历系统中也是“正确”的(因为日历系统是这样工作的)。如果存在年份混淆的问题,也许问题出在展示方式上。 - KingCrunch
1
如果你想要得到一个人的年龄(以岁为单位),并且在他们的生日时年龄增加1岁,那么这段代码是正确的。 - Nik Dow

9

请检查这个

<?php
$c= date('Y');
$y= date('Y',strtotime('1988-12-29'));
echo $c-$y;
?>

1
你是否考虑添加一些解释说明这段代码为什么有效,以及它是如何回答问题的?这对于提问者和其他人都非常有帮助。 - Andrew Barber
1
我找了一个简单的解决方案,它有效,无需解释,很容易理解。感谢您提供这段代码。 - Kristjan O.
这对于1970年至2038年范围之外的日期不起作用,是吗?这就是DateTime的作用。 - mbomb007

3

尝试使用DateTime解决这个问题:

$now      = new DateTime();
$birthday = new DateTime('1973-04-18 09:48:00');
echo $now->diff($birthday)->format('%y years'); // 49 years

在这里查看演示


3
使用以下代码可以获得包括年、月和日的完整年龄 -
    <?php
     //full age calulator
     $bday = new DateTime('02.08.1991');//dd.mm.yyyy
     $today = new DateTime('00:00:00'); // Current date
     $diff = $today->diff($bday);
     printf('%d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
    ?>

0

什么鬼?

strtotime(date('d-m-Y'))

你是从当前时间戳生成一个日期字符串,然后再将日期字符串转换回时间戳吗?

顺便说一下,它无法正常工作的原因之一是 strtotime() 假定数字日期是 m/d/y 格式(即日期在前的美国日期格式)。另一个原因是该参数($birthday)在公式中未被使用。


0

$date更改为$birthday


0

这个函数运行良好。

function age($birthday){
 list($day,$month,$year) = 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 ($day_diff < 0 && $month_diff < 0){$year_diff--;}
 return $year_diff;
}

查看博客文章


0

这个有效:

<?
$date = date_create('1984-10-26');
$interval = $date->diff(new DateTime);
echo $interval->y;
?>

如果您告诉我您的$birthday变量以什么格式出现,我将为您提供准确的解决方案


0

这是我的长/详细版本(如果您愿意,可以缩短它):

$timestamp_birthdate = mktime(9, 0, 0, $birthdate_month, $birthdate_day, $birthdate_year);
$timestamp_now = time();
$difference_seconds = $timestamp_now-$timestamp_birthdate;
$difference_minutes = $difference_seconds/60;
$difference_hours = $difference_minutes/60;
$difference_days = $difference_hours/24;
$difference_years = $difference_days/365;

0

为了获得超高的精度,您需要考虑闰年因素:

function get_age($dob_day,$dob_month,$dob_year){
    $year   = gmdate('Y');
    $month  = gmdate('m');
    $day    = gmdate('d');
     //seconds in a day = 86400
    $days_in_between = (mktime(0,0,0,$month,$day,$year) - mktime(0,0,0,$dob_month,$dob_day,$dob_year))/86400;
    $age_float = $days_in_between / 365.242199; // Account for leap year
    $age = (int)($age_float); // Remove decimal places without rounding up once number is + .5
    return $age;
}

所以使用:

echo get_date(31,01,1985);

或者其他什么...

注意:要查看您的精确年龄到小数点

return $age_float

取而代之。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接