【问题标题】:CakePHP: Time helper to show ageCakePHP:显示年龄的时间助手
【发布时间】:2011-04-30 23:07:32
【问题描述】:

我有一个 MySQL DATETIME 字段,其中包含用户的出生日期。我想用那个日期来显示用户的年龄。

有时间核心助手的方法来做到这一点吗?

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

谢谢,

琼斯

【问题讨论】:

    标签: datetime cakephp helper


    【解决方案1】:

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

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

    您可以在 Cake 表单助手中配置日期选择范围。

    【讨论】:

      【解决方案2】:

      添加新答案,因为代码会显示得更好。我会怎么做:

      在你的模型中创建virtual field 像这样。

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

      然后将其用作模型中的普通字段。 :)

      【讨论】:

      • 这看起来不错,但我遇到了一个 sql 错误。这是我的代码 var $virtualFields = array( 'age' => "(YEAR(NOW()-YEAR(User.dob))" ); 错误是您的 SQL 语法有错误;请查看手册对应于您的 MySQL 服务器版本,以便在 'AS User__age FROM users AS User WHERE 1 = 1 附近使用正确的语法
      • 有一个错字 - 括号计数错误 :) 获取代码并重试
      • 这仅适用于该人当年的生日之后。如果用户的生日在 8 月,而您在 3 月运行,则会显示用户大一岁。
      • tyjkenn 是正确的,即使在一年后似乎仍然没有发布任何解决方案,因为尽管存在明显缺陷,但该解决方案被选为最佳解决方案。即将发布另一个问题...
      【解决方案3】:

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

      /*
       * @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', 'Y-m-d');

      【讨论】:

        【解决方案4】:

        这个函数叫做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

        【讨论】:

        • +1 我不知道这个函数,但我坚持我的回答,你应该熟悉 PHP 日期函数!
        • 谢谢你,现在我只需要弄清楚如何在年龄中显示它:34
        【解决方案5】:

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

        这与自动表单域有关。您可以使用选项调整年份范围。查看Book

        【讨论】:

          猜你喜欢
          • 2010-12-19
          • 1970-01-01
          • 2015-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多