用php计算年龄

用php计算年龄,php,Php,我需要用php计算年龄。 我使用这个解决方案: $birthdate = '1986-09-16'; $_age = floor( (strtotime(date('Y-m-d')) - strtotime($birthDate)) / 31556926); $birthDate = from database in timestamp format... $birth = new \DateTime($birthDate); $now = new \DateTime; $age = $no

我需要用php计算年龄。 我使用这个解决方案:

$birthdate = '1986-09-16';

$_age = floor( (strtotime(date('Y-m-d')) - strtotime($birthDate)) / 31556926);
$birthDate = from database in timestamp format...
$birth = new \DateTime($birthDate);
$now = new \DateTime;
$age = $now->diff($birth)->y;

一切正常,但例如,如果

生日='1194-01-06'

$birth='1900-01-01'

结果总是44

如果
$birth='1910-11-09'
一切又恢复正常,结果是103。为什么?

注意:由于一些问题,我不想使用diff()函数

编辑:

早些时候,我对diff()有一些问题

警告范围()

显示在处理过程中和网站刷新后,一切都很好再次。。。我找不到解决方法,在某个地方我读到使用diff()可能导致它。所以我尝试了另一种解决方案,它奏效了。。。直到现在

最后我使用了这个解决方案:

$birthdate = '1986-09-16';

$_age = floor( (strtotime(date('Y-m-d')) - strtotime($birthDate)) / 31556926);
$birthDate = from database in timestamp format...
$birth = new \DateTime($birthDate);
$now = new \DateTime;
$age = $now->diff($birth)->y;
我随机得到

Warning 
range(): step exceeds the specified range

再次说明。

这是因为您使用的是
date
,即使用默认值为
time()
时间戳,该值基于1970年1月1日00:00:00 GMT开始的历元-自1970年以来已有44年


有关这方面的更多信息可以在PHP手册中找到:

您是否阅读了
strotime()
Manual()


函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于now中给出的时间戳,或者如果now未提供,则相对于当前时间。

整数限制问题,或者:

  • 您的操作系统不处理负时间戳
  • 32位系统上有符号整数的最大整数值
  • 时间戳的有效范围通常为1901年12月13日星期五20:45:54 UTC
    至2038年1月19日星期二03:14:07 UTC。(这些日期对应于32位有符号整数的最小值和最大值。)


    此外,并非所有平台都支持负时间戳,因此您的日期范围可能被限制为不早于Unix纪元(1970年1月1日)。

    DateTime::diff()
    有哪些“问题”?另外
    strotime(date('Y-m-d'))
    是获取
    time()
    的一种可怕的迂回方式。不确定发生了什么,但最好从1970-01年开始尝试这种strotime-01@DarkSide:是的,并使用负整数反向工作。@DarkSide认为这是基于手册:(参见Changelog下)是的,我对PHP的所有了解都是从那里获得的:-)我更改了措辞,“基于”听起来更好;)