我有一个MySQL DATETIME字段,它包含用户的出生日期。我想用这个日期显示用户年龄。CakePHP:显示时间的助手
有没有Time Core助手的方法来做到这一点?
此外,为什么当你添加一个DATETIME字段到Cake中的一个表单时,它不会让你选择一个小于1990的日期吗?
感谢,
Jonesy
我有一个MySQL DATETIME字段,它包含用户的出生日期。我想用这个日期显示用户年龄。CakePHP:显示时间的助手
有没有Time Core助手的方法来做到这一点?
此外,为什么当你添加一个DATETIME字段到Cake中的一个表单时,它不会让你选择一个小于1990的日期吗?
感谢,
Jonesy
添加新的答案,因为该代码将显示更好。我该怎么做:
在你的模型中创建virtual field这样。
var $virtualFields = array(
'age' => "YEAR(NOW())-YEAR(YourModelName.datetimeField)"
);
然后将其用作模型中的普通字段。 :)
您可以使用标准PHP函数执行计算 - 查看日期部分。我不会告诉你如何去做,因为你自己做这件事会学到很多。
我会说你需要小心才能得到准确的结果。 365天并不总是一年,一个月有不同的天数。
您可以在Cake表单助手中配置日期选择范围。
你是完全正确的利奥,基本需要总是 – 2010-10-27 09:29:55
函数被调用timeAgoInWords
<?php echo $this->Time->timeAgoInWords(
'1975-12-29 13:40',
array(
'end'=>'+150 years'
)
);?>
结束参数的意思是用文字前显示的时间,直到日期是小于150岁(至少我没有听说过的人150yo :))) )。
目前的结果是:出生:面前有34岁9个月,4周
还要检查API和食谱贾森建议
我总是用这种方法进行测试:
/*
* @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');
这看起来不错,但即时通讯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
有一个错字 - 错误的括号数:)获取代码并尝试再次 – 2010-10-27 18:44:40
只有当该人在当年的生日之后才有效。如果用户的生日是在八月份,而你在三月份运行该用户,则表示该用户比一岁大。 – tyjkenn 2012-05-19 03:24:40