CakePHP: время помощник, чтобы показать возраст - PullRequest
3 голосов
/ 27 октября 2010

У меня есть поле MySQL DATETIME, в котором хранится дата рождения пользователя. Я хочу использовать эту дату для отображения возраста пользователя в годах.

Есть ли метод ядра Core Time, чтобы сделать это?

Кроме того, почему, когда вы добавляете поле DATETIME в форму в Cake, оно не позволяет вам выбрать дату меньше 1990? *

Спасибо

Джоунси

Ответы [ 5 ]

4 голосов
/ 27 октября 2010

функция называется timeAgoInWords

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

Конечный параметр означает отображение времени назад со словами до даты менее 150 лет (по крайней мере, я не слышал о 150летнем человеке :)))).

Текущий результат: родился: до 34 лет, 9 месяцев, 4 недель

Но также проверьте API и CookBook, как рекомендует Джейсон

3 голосов
/ 27 октября 2010

Добавление нового ответа, потому что код будет показан лучше.Как бы я это сделал:

в вашей модели создайте виртуальное поле вот так.

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

Затем используйте его как обычное поле в модели.:)

3 голосов
/ 27 октября 2010

timeAgoinWords() может делать то, что вы хотите для первой части.Проверьте Книга

Это связано с полями автоматической формы.Вы можете настроить диапазон года с помощью параметров.Проверьте Книга .

1 голос
/ 27 октября 2010

Вы можете выполнить расчет, используя стандартные функции PHP - смотрите в разделе даты. Я не собираюсь рассказывать вам, как это сделать, потому что вы многому научитесь, делая это самостоятельно.

Я скажу, что вы должны быть осторожны, чтобы получить точный результат. 365 дней - это не всегда год, а месяц имеет различное количество дней.

Вы можете настроить диапазон выбора даты в помощнике формы Cake.

0 голосов
/ 27 октября 2010

Я всегда использую этот проверенный метод:

/*
 * @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;
}

, вероятно, его можно реорганизовать, но он работает с високосными годами и всеми видами вещей.так что я никогда не беспокоился ...

он использует константу, которой у вас нет

просто: define ('FORMAT_DB_DATE', 'Ym-d');

...