我有一个PHP的年龄计算脚本。但是,它似乎适用于一些日期,我不明白为什么它不会工作。
function Agecalc($birthday)
{
list($day,$month,$year) = explode("/",$birthday);
$day_diff = date("d") - $day;
$month_diff = date("m") - $month;
$year_diff = date("Y") - $year;
if ($day_diff < 0 || $month_diff < 0)
$year_diff--;
return $year_diff;
}
echo Agecalc('19/2/1994');
当它应该是18时返回“17”
答案 0 :(得分:1)
除了你应该使用日期差异的内置函数之外,我们可以通过分解来解决你所呈现的代码无法正常工作的问题。
function Agecalc($birthday)
{
list($day,$month,$year) = explode("/",$birthday);
$day_diff = date("d") - $day; // 9 - 19 = -10
$month_diff = date("m") - $month; // 3 - 2 = 1
$year_diff = date("Y") - $year; // 2012 - 1994 = 18
现在您在原始代码中所做的是说,如果差异或月份差异是负数,那么年龄就会超过一整年。这基本上是有缺陷的,因为当天差异是负数时,计算可能只有一个月,而不是一年。
所以你通过递减月份差来迎合负面日子。
if ($day_diff < 0) {
$month_diff--;
}
现在我们正在处理差异,我们的月份差异为0
。如果它是负数我们仍然需要考虑它,所以最后留下这个块。
if ($month_diff < 0) {
$year_diff--;
}
return $year_diff;
}
您示例的最终结果现在返回18
,因为即使考虑到负数天数,这些月份仍然是正数。
答案 1 :(得分:1)
您的函数每次返回错误的年龄输入日部分(在input_date中)优于当前部分(在current_date中)。
请在下面请一个可以提供帮助的功能。如有任何问题,请告诉我。
/* By default,
* format is 'us'
* and delimiter is '-'
*/
function date_calculate($input_date, $format = 'us', $delimiter = '-')
{
switch (strtolower($format)) {
case 'us': // date in 'us' format (yyyy/mm/dd), like '1994/03/01'
list($y, $m, $d) = explode($delimiter, $input_date);
break;
case 'fr': // date in 'fr' format (dd/mm/yyyy), like '01/03/1994'
list($d, $m, $y) = explode($delimiter, $input_date);
break;
default: return null;
}
$tz = new \DateTimeZone('UTC'); // TimeZone. Not required but can be useful. By default, server TimeZone will be returned
$format_date = sprintf('%s-%s-%s', $y, $m, $d);
$cur_date = new \DateTime(null, $tz);
$user_date = new \DateTime($format_date, $tz);
$interval = $user_date->diff($cur_date);
return [
'day' => $interval->format('%r%d'),
'month' => $interval->format('%r%m'),
'year' => $interval->format('%r%y'),
];
}
var_dump(date_calculate('19/02/1994', 'fr', '/'));
更多++:
DateInterval::format
- &gt; http://nl1.php.net/manual/en/dateinterval.format.php DateTime::diff
- &gt; http://nl1.php.net/manual/en/datetime.diff.php 答案 2 :(得分:0)
使用PHP内置的DateTime函数来计算它,特别是DateTime::diff(..)
。
function AgeCalc($birthday)
{
$dateBirthday = DateTime::createFromFormat('d/m/Y', $birthday);
$dateNow = new DateTime();
$difference = $dateNow->diff($dateBirthday);
return $difference->y;
}
答案 3 :(得分:0)
除非您确定是在同一个月,否则您不应该对day_diff<0
进行测试。目前它减去一年,如果它是12月5日,我的生日是4月13日,因为13大于5。
答案 4 :(得分:0)
更新
我发了一篇博文,介绍了3个最受欢迎的功能,以便在PHP中实现年龄。
查看结果
OLD
在一条线上:仅供参考,与人类计算生日的方式相比,有更短的方式:
return intval(substr(date('Ymd') - date('Ymd', strtotime($birthday)), 0, -4))
答案 5 :(得分:0)
这是更简单的简单php来计算生日年龄
function getAge($birthdate){
return floor((time() - strtotime($birthdate))/31556926);
}