PHP年龄计算器错误的年龄

时间:2012-03-09 00:11:16

标签: php

我有一个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”

6 个答案:

答案 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', '/'));

更多++:

答案 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中实现年龄。

查看结果

HERE

  

OLD

在一条线上:仅供参考,与人类计算生日的方式相比,有更短的方式:

return intval(substr(date('Ymd') - date('Ymd', strtotime($birthday)), 0, -4))

答案 5 :(得分:0)

这是更简单的简单php来计算生日年龄

function getAge($birthdate){
  return floor((time() - strtotime($birthdate))/31556926);
}