2012-03-09 110 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', '/')); 

更多++: