Datetime CakePHP:显示年龄的时间助手

Datetime CakePHP:显示年龄的时间助手,datetime,cakephp,helper,Datetime,Cakephp,Helper,我有一个MySQL DATETIME字段,它保存用户的出生日期。我想使用该日期显示用户的年龄(以年为单位) 有时间核心助手的方法来做这件事吗 另外,为什么在Cake中向表单添加DATETIME字段时,它不允许您选择小于1990的日期 谢谢 JonesytimeAgoinWords()可以为第一部分做你想做的事情。查看 这与automagic表单字段有关。您可以使用选项调整年份范围。查看。您可以使用标准PHP函数执行计算-查看日期部分。我不会告诉你怎么做,因为你自己做会学到很多东西 我要说的是,你

我有一个MySQL DATETIME字段,它保存用户的出生日期。我想使用该日期显示用户的年龄(以年为单位)

有时间核心助手的方法来做这件事吗

另外,为什么在Cake中向表单添加DATETIME字段时,它不允许您选择小于1990的日期

谢谢

Jonesy

timeAgoinWords()
可以为第一部分做你想做的事情。查看


这与automagic表单字段有关。您可以使用选项调整年份范围。查看。

您可以使用标准PHP函数执行计算-查看日期部分。我不会告诉你怎么做,因为你自己做会学到很多东西

我要说的是,你需要小心才能得到准确的结果。365天并不总是一年,一个月的天数是可变的


您可以在Cake form helper中配置日期选择范围。

该函数称为timeAgoInWords

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

end参数的意思是用单词显示时间,直到日期小于150年(至少我没有听说过150yo man:))

目前的结果是:出生:34岁之前,9个月,4周


但也要按照Jason的建议检查API和CookBook,添加新答案,因为代码会显示得更好。我将如何做到这一点:

在您的模型中,创建如下内容

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

然后将其用作模型中的法线字段。:)

我总是使用这种经过测试的方法:

/*
 * @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;
}
它可能会被重构 但它适用于闰年和各种各样的东西。所以我从来没有烦恼过

它使用一个你没有的常数


它只是:定义('FORMAT_DB_DATE','Y-m-d')

+1我不知道这个函数,但我坚持我的答案,您应该熟悉PHP日期函数!谢谢你,现在我需要弄清楚如何在几年内显示它,就像在年龄一样:34这看起来不错,但我遇到了一个sql错误。这是我的代码var$virtualFields=array('age'=>“(YEAR(NOW()-YEAR(User.dob)));错误在于您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解使用“AS
User_uage
FROM
users
AS
User
的正确语法,其中1=1错误括号计数:)获取代码,然后再试一次。只有在该人生日之后,该代码才有效。如果用户的生日在8月,而您在3月运行该程序,则会显示该用户比您大一岁。tyjkenn是正确的,而且似乎一年后仍没有发布任何解决方案,因为此解决方案被选为最佳解决方案,尽管存在明显的缺陷。不久将发布另一个问题。。。