2010-10-26 45 views
3

我有一個MySQL DATETIME字段,它包含用戶的出生日期。我想用這個日期顯示用戶年齡。CakePHP:顯示時間的助手

有沒有Time Core助手的方法來做到這一點?

此外,爲什麼當你添加一個DATETIME字段到Cake中的一個表單時,它不會讓你選擇一個小於1990的日期嗎?

感謝,

Jonesy

回答

3

添加新的答案,因爲該代碼將顯示更好。我該怎麼做:

在你的模型中創建virtual field這樣。

var $virtualFields = array(
    'age' => "YEAR(NOW())-YEAR(YourModelName.datetimeField)" 
); 

然後將其用作模型中的普通字段。 :)

+0

這看起來不錯,但即時通訊sql錯誤。這裏是我的代碼var $ virtualFields = array( \t'age'=>「(YEAR(NOW() - YEAR(User.dob))」 \t);錯誤是你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'AS' User__age'附近使用正確的語法FROM'users' AS'User' WHERE 1 = 1 – iamjonesy 2010-10-27 15:18:06

+1

有一個錯字 - 錯誤的括號數:)獲取代碼並嘗試再次 – 2010-10-27 18:44:40

+1

只有當該人在當年的生日之後纔有效。如果用戶的生日是在八月份,而你在三月份運行該用戶,則表示該用戶比一歲大。 – tyjkenn 2012-05-19 03:24:40

3

timeAgoinWords()可以做你想做的第一個部分。檢查出Book

這與automagic表單域有關。您可以使用選項調整年份範圍。檢查出Book

1

您可以使用標準PHP函數執行計算 - 查看日期部分。我不會告訴你如何去做,因爲你自己做這件事會學到很多。

我會說你需要小心才能得到準確的結果。 365天並不總是一年,一個月有不同的天數。

您可以在Cake表單助手中配置日期選擇範圍。

+0

你是完全正確的利奧,基本需要總是 – 2010-10-27 09:29:55

4

函數被調用timeAgoInWords

<?php echo $this->Time->timeAgoInWords(
     '1975-12-29 13:40', 
     array(
      'end'=>'+150 years' 
    ) 
);?> 

結束參數的意思是用文字前顯示的時間,直到日期是小於150歲(至少我沒有聽說過的人150yo :))) )。

目前的結果是:出生:面前有34歲9個月,4周

還要檢查API和食譜賈森建議

+1

+1我不知道這個功能,但我支持我的答案,你應該熟悉PHP日期功能! – Leo 2010-10-26 20:35:57

+1

感謝您的這一點,現在我只需要弄清楚如何在年齡顯示它只有在年齡:34 – iamjonesy 2010-10-27 08:22:14

0

我總是用這種方法進行測試:

/* 
* @return int age (0 if both timestamps are equal or empty, -1 on invalid dates) 
* 2009-03-12 ms 
*/ 
function age($start = null, $end = null, $accuracy = 0) { 
    $age = 0; 
    if (empty($start) && empty($end) || $start == $end) { 
     return 0; 
    } 

    if (empty($start)) { 
     list($yearS, $monthS, $dayS) = explode('-', date(FORMAT_DB_DATE)); 
    } else { 
     $startDate = $this->fromString($start); 
     $yearS = date('Y', $startDate); 
     $monthS = date('m', $startDate); 
     $dayS = date('d', $startDate); 
     if (!checkdate($monthS, $dayS, $yearS)) { 
      return -1; 
     } 
    } 
    if (empty($end)) { 
     list($yearE, $monthE, $dayE) = explode('-', date(FORMAT_DB_DATE)); 
    } else { 
     $endDate = $this->fromString($end); 
     $yearE = date('Y', $endDate); 
     $monthE = date('m', $endDate); 
     $dayE = date('d', $endDate); 
     if (!checkdate($monthE, $dayE, $yearE)) { 
      return -1; 
     } 
    } 

    $n_tag = $dayE; 
    $n_monat = $monthE; 
    $n_jahr = $yearE; 
    $g_tag = $dayS; 
    $g_monat = $monthS; 
    $g_jahr = $yearS; 
    $g_date = mktime(0,0,0,$g_tag,$g_monat,$g_jahr); 

    if (($n_monat>$g_monat)||(($n_monat == $g_monat)&&($n_tag>$g_tag))||(($n_monat == $g_monat)&&($n_tag==$g_tag))) { 
     $age = $n_jahr-$g_jahr; // is correct if one already had his birthday this year 
    } else { 
     $age = $n_jahr-$g_jahr-1; // is correct if one didnt have his birthday yet in this year 
    } 
    return $age; 
} 

大概可以refactured 但它與閏年和各種東西的作品。所以我從來不打擾...

它採用恆定你沒有

它只是:定義( 'FORMAT_DB_DATE', 'Y-M-d');