代码之家  ›  专栏  ›  技术社区  ›  Naveed

如何用php 5.2计算人的年龄(月+日)?

  •  1
  • Naveed  · 技术社区  · 14 年前

    我问过这个 question 之前接受了这个答案,但是现在我发现我们服务器上的PHP版本是5.2,并且 日期时间::diff() 不是在努力。

    我想用出生日期和一个给定的日期来计算一个人的年龄,以月加天为单位。

    日期格式输入: Y-M-D(示例:1986-08-23)

    输出:

    5 months and 20 days old.
    150 months and 4 days old.
    285 months and 30 days old.
    

    谢谢

    2 回复  |  直到 14 年前
        1
  •  5
  •   user113292    14 年前

    这里有一个解决方案可以精确地确定月数和天数,包括闰年。假设7月21日至8月21日为1个月0天,不是1个月1天,3月21日至4月20日为0个月30天,不是1个月0天。在这两种情况下,后一种情况是这样的,当你直接除以30来计算月份时。

    我确信有更好的方法来优化函数,但它可以完成任务:

    function diff_date($start_date, $end_date) {
      list($start_year, $start_month, $start_day) = explode('-', $start_date);
      list($end_year, $end_month, $end_day) = explode('-', $end_date);
    
      $month_diff = $end_month - $start_month;
      $day_diff   = $end_day - $start_day;
    
      $months = $month_diff + ($end_year - $start_year) * 12;
      $days = 0;
    
      if ($day_diff > 0) {
        $days = $day_diff;
      }
      else if ($day_diff < 0) {
        $days = $end_day;
        $months--;
    
        if ($month_diff > 0) {
          $days += 30 - $start_day;
    
          if (in_array($start_month, array(1, 3, 5, 7, 8, 10, 12))) {
            $days++;
          }
          else if ($start_month == 2) {
            if (($start_year % 4 == 0 && $start_year % 100 != 0) || $start_year % 400 == 0) {
              $days--;
            }
            else {
              $days -= 2;
            }
          }
    
          if (in_array($end_month - 1, array(1, 3, 5, 7, 8, 10, 12))) {
            $days++;
          }
          else if ($end_month - 1 == 2) {
            if (($end_year % 4 == 0 && $end_year % 100 != 0) || $end_year % 400 == 0) {
              $days--;
            }
            else {
              $days -= 2;
            }
          }
        }
      }
    
      return array($months, $days);
    }
    
    list($months, $days) = diff_date('1984-05-26', '2010-04-29');
    
    print $months . ' months and ' . $days . ' days old.';
    

    输出:

    314个月,3天。


    编辑: 我试图消除代码中的冗余,但忘记了重命名一个变量。此功能现在可以正常工作 diff_date('2010-06-29', '2011-07-01') .


    编辑: 现在正确的工作结束后几个月发生的31或28/29天。

        2
  •  0
  •   AKX Bryan Oakley    14 年前

    使用您最喜欢的日期分析函数(strtotime、strptime、mktime)从日期中获取一个unix时间戳,然后使用间隔($now-$then)…然后 work out how many seconds there are in a month 用它来计算这个人活了多少个月(除法和余数是你的朋友)。

    这将给你一个数学上精确的值,它也应该足够接近现实生活。

    推荐文章