2012-06-27 245 views
0

我正試圖從ExpressionEngine網站上的出生日期計算出一個人的年齡。 以下代碼適用於我的本地測試站點,但服務器正在使用較早版本的PHP(5.2.17),因此我不知所措。 有人可能會建議我需要使用什麼代碼嗎?計算PHP的年齡5.2

{exp:channel:entries channel='zoo_visitor'} 
<?php 
$dob = new DateTime('{member_birthday format='%Y-%m-%d'}'); 
$now = new DateTime('now'); 
// This returns a DateInterval object. 
$age = $now->diff($dob); 
// You can output the date difference however you choose. 
echo 'This person is ' .$age->format('%y') .' years old.'; 
?> 
{/exp:channel:entries} 
+2

你有什麼錯誤? – Adi

回答

1

可以使用diff只以上PHP 5.3

您可以修改嘗試,它可以在5.2

$age = $now->modify('-' . $dob->format('Y') . 'year'); 
2
$dob = strtotime('{member_birthday format='%Y-%m-%d'}'); 
$now = time(); 
echo 'This person is ' . (1970 - date('Y', ($now - $dob))) .' years old.'; 
+0

它顯示負值 –

+0

@Jon從什麼時候一個簡單的整數變量有'getTimestamp'方法? – slash197

+0

我試過以下內容:'$ dob = strtotime('{member_birthday format ='%Y-%m-%d'}'); $ now = time();回聲(1970年 - 日期('Y',($ dob - $ now)));'但這顯示一個年齡比 – user579984

3

您當前的代碼將無法工作,因爲DateTime::diff是在PHP 5.3.0中引入。

通常的日期算術是相當棘手的,因爲你必須考慮時區,DST和閏年,但對於像計算「全年」差異那樣簡單的任務,你可以很容易地完成。

這個想法是,結果等於結束日期的年份減去開始日期的年份,並且如果開始日期的月份/日期在年份內早於結束日期,那麼您應該從中減去1。代碼:

$dob = new DateTime('24 June 1940'); 
$now = new DateTime('now'); 

echo year_diff($now, $dob); 

function year_diff($date1, $date2) { 
    list($year1, $dayOfYear1) = explode(' ', $date1->format('Y z')); 
    list($year2, $dayOfYear2) = explode(' ', $date2->format('Y z')); 
    return $year1 - $year2 - ($dayOfYear1 < $dayOfYear2); 
} 

See it in action。注意結果如何在生日指定的同一天增加1。

1

多的搜索後,我找到了答案:

<?php 
    //date in mm/dd/yyyy format 
    $birthDate = "{member_birthday format='%m/%d/%Y'}"; 
    //explode the date to get month, day and year 
    $birthDate = explode("/", $birthDate); 
    //get age from date or birthdate 
    $age = (date("md", 
       date("U", 
         mktime(0, 
          0, 
          0, 
          $birthDate[0], 
          $birthDate[1], 
          $birthDate[2]) 
        ) 
       ) 
      > date("md") 
      ? ((date("Y") - $birthDate[2]) - 1) 
      : (date("Y") - $birthDate[2])); 
    echo $age; 
?> 
0

只用一年的天的計算是關閉一個在某些極端情況:它們顯示1年2012-02-29 2011-2020和03-01,而這應該是0年(和11個月和28天)。一個可能的解決方案,考慮到閏年是:

<?php 
    function calculateAge(DateTime $birthDate, DateTime $now = null) { 
     if ($now == null) { 
      $now = new DateTime; 
     } 

     $age = $now->format('Y') - $birthDate->format('Y'); 
     $dm = $now->format('m') - $birthDate->format('m'); 
     $dd = $now->format('d') - $birthDate->format('d'); 

     if ($dm < 0 || ($dm == 0 && $dd < 0)) { 
      $age--; 
     } 

     return $age; 
    } 

    echo calculateAge(new DateTime('2011-04-01'), new DateTime('2012-03-29')); 

user579984的解決方案工作也一樣,雖然。

0
$birthday = '1983-03-25'; 
$cm = date('Y', strtotime($birthday)); 
$cd = date('Y', strtotime('now')); 

$res = $cd - $cm; 

if (date('m', strtotime($birthday)) > date('m', strtotime('now'))) 
    $res--; 
else if ((date('m', strtotime($birthday)) == date('m', strtotime('now'))) && 
    (date('d', strtotime($birthday)) > date('d', strtotime('now')))) 
    $res--; 

echo $res;