我需要在php中计算年龄。 我使用这个解决方案:
$birthdate = '1986-09-16';
$_age = floor( (strtotime(date('Y-m-d')) - strtotime($birthDate)) / 31556926);
来自here
一切正常,但例如
$birthday = '1194-01-06'
或
$birthday = '1900-01-01'
结果总是 44 。
如果$birthday = '1910-11-09'
一切正常,结果 103 。为什么呢?
注意:由于某些问题,我不想使用diff()函数。
编辑:
早些时候我遇到了diff(),有些
的问题警告范围()
显示在处理期间和网站刷新后一切都很好...我找不到解决方案来修复它,我读到的某些地方使用diff()可能会导致它。所以我尝试了其他解决方案,直到现在才有效。
最后我使用了这个解决方案:
$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
试。
答案 0 :(得分:1)
这是因为您正在使用date
使用timestamp
,其默认值为time()
,该默认值基于1970年1月1日开始的EPOCH 00:00:00 GMT - 自1970年以来的44年。
有关详细信息,请参阅PHP手册:http://php.net/manual/en/function.date.php
答案 1 :(得分:0)
您是否阅读了strtotime()
手册(https://php.net/manual/en/function.strtotime.php)?
该函数希望给出一个包含英文日期格式的字符串,并尝试将该格式解析为Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数),相对于现在给出的时间戳,或者当前时间(如果现在没有提供)。
答案 2 :(得分:0)
整数限制问题:
时间戳的有效范围通常是从星期五,1901年12月13日20:45:54 UTC 到星期二,2038年1月19日03:14:07 UTC 。 (这些是与32位有符号整数的最小值和最大值相对应的日期。)
此外,并非所有平台都支持负时间戳,因此您的日期范围可能不会早于Unix时代( 1970年1月1日)。