2011-08-07 54 views

回答

7

這裏是另外一種方式來計算年齡。它使用PHP格式。它只是減去年份,然後檢查這個年份的生日是否已經過去。這可以用標準的PHP函數完成,但我決定像你問的那樣使用Zend_Date。

更新回答

Zend_Date::setOptions(array(
     'format_type' => 'php' 
    )); 
    $today   = new Zend_Date(); 
    $dateOfBirth  = new Zend_Date('1979-04-10', 'Y-m-d'); 

    $age    = $today->toString('Y') - $dateOfBirth->toString('Y'); 
    // Edit: Added julian date adjustments for leap years 
    $adjustJulian = strcmp($today->toString('L'), $dateOfBirth->toString('L')); 
    if ($dateOfBirth->toString('m') > 2) { 
     $dateOfBirth->addDay($adjustJulian); 
    } 

    if ($today->toString('z') < $dateOfBirth->toString('z')) { 
     $age--; 
    } 

感謝@maciej-homziuk用於指出以前的答案的閏年限制。我已經更新了這個答案,爲閏年的朱利安日添加了調整。

+0

'Zend_Date :: setOptions'字符串使得代碼對我無法使用 - 它在調用age函數後廢除了所有的日期格式。 – yentsun

+1

@yentsun那是因爲它在執行代碼之前更改了默認選項。你可以改變它,一旦你有日期Zend_Date :: setOptions(array('format_type'=>'iso')) –

+0

是啊,我已經在我的代碼已經修復了。我雖然可以在你的回答中提到它。 – yentsun

0

這個職位:how to calculate a difference between two Zend_Date objects, in months

如果我正確地閱讀文檔,有一個爲越來越差沒有實現的功能在兩個日期之間以秒/分鐘/.../月/年計算,所以您需要自己計算它。像這樣的東西會做(如果說不上它需要閏年,DST和這樣的考慮):

<?php 
$birth = new Zend_Date('1988-25-06');  
$today = new Zend_Date(); 
$diff = $today->sub($birth)->toValue(); 
$age = floor($diff/3600/24/365); 
+0

我會試試看。謝謝:) –

+0

_toValue_方法是否返回秒數? [documentation](http://framework.zend.com/apidoc/1.11/_Date.html#%5CZend_Date::toValue())僅表示它返回對象的整數表示形式。 –

+0

是的,它是unix時間戳 – yokoloko

0

這是注意做這件事的方式Zend_Date的運算,但似乎很好地工作:

$birthdate = "1975-04-14";<br /> 
$age = floor((time() - strtotime($birthdate))/31556926); 

echo "You are " . $age . " years old today."; 
+3

這是考慮閏年嗎? – Alex

+0

你能解釋一下你的代碼嗎? –

0
$today = new Zend_Date(); 
$dateOfBirth = new Zend_Date('1988-25-06'); 
$age = $today->toString('Y') - $dateOfBirth->toString('Y'); 
if ($today->toString('dd') + $today->toString('MM') * 32 < 
    $dateOfBirth->toString('dd') + $dateOfBirth->toString('MM') * 32) 
    $age--; 
+2

漂亮的代碼。它有什麼作用? – 2011-11-14 23:24:43

+0

上一個例子「$ today-> toString('z')<$ dateOfBirth-> toString('z')」有錯誤,其中'z'是時區。'MM'是月份,'dd'是日,我們需要檢查今年是否已經慶祝生日:「未慶祝」=(M

+0

如果這是對先前答案的更正,它應該是對該答案的評論而不是新答案。同時建議始終解釋您的代碼。 –

0

我喜歡brady.vitrano的方法非常多,它也是建立我自己的動作助手計算基地但是他的代碼不考慮閏年(如果出生日期是1979-03-09 [普通年],今天是2012-03-08 [閏年],他的方法返回33,儘管真實年齡是32) - 這就是它如何延長以在涉及閏年時恢復正確的年齡:

Zend_Date::setOptions(array(
    'format_type' => 'php' 
)); 

$today = new Zend_Date(); 
$dateOfBirth = new Zend_Date($date); 

/*** Considering the leap years if the birth date is on 1st march or later. ***/ 
if ($dateOfBirth->toString('n') > 2) { 
    $birthLeap = $dateOfBirth->toString('L'); 
    $todayLeap = $today->toString('L'); 
} 

$age = $today->toString('Y') - $dateOfBirth->toString('Y'); 

if ($today->toString('z') - $todayLeap < $dateOfBirth->toString('z') - $birthLeap) { 
    $age--; 
} 

這是代碼,如果你想與Zend的默認日期符(而不是PHP的日期符)工作:

$today = new Zend_Date(); 
$dateOfBirth = new Zend_Date($date); 

/*** Considering the leap years if the birth date is on 1st march or later. ***/ 
if ($dateOfBirth->get('M') > 2) { 
    /*** Checking if the birth's year is a leap year. ***/ 
    if ($dateOfBirth->get(Zend_Date::LEAPYEAR)) { 
     $birthLeap = 1; 
    } 

    /*** Checking if today's year is a leap year. ***/ 
    if ($today->get(Zend_Date::LEAPYEAR)) { 
     $todayLeap = 1; 
    } 
} 

$age = $today->get('Y') - $dateOfBirth->get('Y'); 

if ($today->get('D') - $todayLeap < $dateOfBirth->get('D') - $birthLeap) { 
    $age--; 
} 
+0

我再次使用'$ today = new Zend_Date('2012-03-08')檢查了我的答案; $ dateOfBirth = new Zend_Date('1979-03-09');'它返回32就像你說的那樣。但是,我確實發現今天2月29日和3月1日出現問題。您的服務器date.timezone設置是什麼? –

+0

謝謝你指出。我更新了閏年修正的答案。 –

1

我建議您使用此功能:

public function getAge($dob) 
{ 
    $today = new Zend_Date(); 
    $dob = new Zend_Date($dob, Tuffle_Date::getDBFormat()); 

    $y = Zend_Date::YEAR; 
    $m = Zend_Date::MONTH; 
    $d = Zend_Date::DAY; 

    $dobCurrentYear = new Zend_Date($today->get($y) . '-' . $dob->get($m) . '-' . $dob->get($d), Tuffle_Date::getDBFormat()); 
    $dobCurrentYear->setYear($today->get('Y')); 

    $age = $today->get($y) - $dob->get($y); 

    if (!$dobCurrentYear->isLater($today)) { 
     $age--; 
    } 

    return $age; 
} 
+0

在ZF1中,這'Tuffle_Date :: getDBFormat()'給出了致命的錯誤,所以我刪除了這個,現在它工作正常。 –