2012-03-09 114 views
0

我有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”吗?

+3

你重新发明轮子:http://uk.php.net/manual/en /datetime.diff.php – 2012-03-09 00:15:39

+0

[在PHP中减去日期]的可能重复(http://stackoverflow.com/questions/3090067/subtracting-dates-in-php) – 2012-03-09 00:16:55

回答

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; 
} 
0

除非您确定它是同一个月,否则您不应该测试day_diff<0。目前如果是12月5日,我的生日是4月13日,因为13大于5,所以它会减去一年。

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 

你在你原来的代码做现在,如果当天diff的月DIFF为负时说,那么年龄了通过整整一年。这是根本上有缺陷的,因为当日差值为负时,计算可能只有一个月,而不是一年。

因此,您通过减少月份差异来迎合负面的日子。

if ($day_diff < 0) { 
     $month_diff--; 
    } 

现在差​​异日照和我们的月diff = 0。如果它是负值,我们仍然需要考虑它,所以请将此块留在最后。

if ($month_diff < 0) { 
     $year_diff--; 
    } 

    return $year_diff; 
} 

最终的结果从你的例子现在返回18,因为即使在考虑了负天后,几个月仍然为正。

0

UPDATE

我犯了一个博客帖子大约3个最流行的funcs中获得的年龄在PHP。

查看结果

HERE

OLD

在同一行:仅供参考,还有就是我们人类是如何计算的生日更短的方式相媲美:

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

这是更简短的php来计算从生日电子时代

function getAge($birthdate){ 
    return floor((time() - strtotime($birthdate))/31556926); 
} 
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', '/')); 

更多++: