Home  >  Article  >  Backend Development  >  PHP calculates age accurately to year, month and day

PHP calculates age accurately to year, month and day

高洛峰
高洛峰Original
2016-10-20 16:33:131056browse

 This article mainly introduces the method of calculating age in PHP to the accuracy of year, month and day, involving the related skills of PHP operating dates and strings. It is very simple and practical. Friends in need can refer to it

 This article tells the example of calculating age in PHP to the accuracy of year, month and day. Year, month and day method. Share it with everyone for your reference. The details are as follows:

<?php
   
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
   
class Age {
     
  /**
   * 计算年龄精准到年月日
   * @param type $birthday
   * @return array
   */
   
  public function calAge($birthday) {
    list($byear, $bmonth, $bday) = explode(&#39;-&#39;, $birthday);
    list($year, $month, $day) = explode(&#39;-&#39;, date(&#39;Y-m-d&#39;));
    $bmonth = intval($bmonth);
    $bday = intval($bday);
    if ($bmonth < 10) {
      $bmonth = &#39;0&#39; . $bmonth;
    }
    if ($bday < 10) {
      $bday = &#39;0&#39; . $bday;
    }
    $bi = intval($byear . $bmonth . $bday);
    $ni = intval($year . $month . $day);
    $not_birth = 0;
    if ($bi > $ni) {
      $not_birth = 1;
      $tmp = array($byear, $bmonth, $bday);
      list($byear, $bmonth, $bday) = array($year, $month, $day);
      list($year, $month, $day) = $tmp;
      list($bi, $ni) = array($ni, $bi);
    }
    $years = 0;
    while (($bi + 10000) <= $ni) {//先取岁数
      $bi += 10000;
      $years++;
      $byear++;
    }//得到岁数后 抛弃年
    list($m, $d) = $this->getMD(array($year, $month, $day), array($byear, $bmonth, $bday));
    return array(&#39;year&#39; => $years, &#39;month&#39; => $m, &#39;day&#39; => $d, &#39;not_birth&#39; => $not_birth);
  }
   
  /**
   * 只能用于一年内计算
   * @param type $ymd
   * @param type $bymd
   */
  public function getMD($ymd, $bymd) {
    list($y, $m, $d) = $ymd;
    list($by, $bm, $bd) = $bymd;
    if (($m . $d) < ($bm . $bd)) {
      $m +=12;
    }
    $month = 0;
    while ((($bm . $bd) + 100) <= ($m . $d)) {
      $bm++;
      $month++;
    }
    if ($bd <= $d) {//同处一个月
      $day = $d - $bd;
    } else {//少一个月
      $mdays = $bm > 12 ? $this->_getMothDay( ++$by, $bm - 12) : $this->_getMothDay($by, $bm);
      $day = $mdays - $bd + $d;
    }
    return array($month, $day);
  }
   
  private function _getMothDay($year, $month) {
    switch ($month) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
        $day = 31;
        break;
      case 2:
        $day = (intval($year % 4) ? 28 : 29); //能被4除尽的为29天其他28天
        break;
      default:
        $day = 30;
        break;
    }
    return $day;
  }
   
}
   
$cage = new Age();
$test = array(
  &#39;1990-06-12&#39;,
  &#39;1990-07-13&#39;,
  &#39;1990-08-16&#39;,
  &#39;1990-10-10&#39;,
  &#39;1990-10-13&#39;,
  &#39;1990-10-15&#39;,
  &#39;1990-11-9&#39;,
  &#39;1990-11-22&#39;,
  &#39;2016-11-22&#39;,
  &#39;2016-8-22&#39;,
  &#39;2016-10-13&#39;,
);
echo date(&#39;Y-m-d&#39;);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
foreach($test as $v){
  $tmp = $cage->calAge($v);
  echo $v , &#39;:&#39;, $tmp[&#39;year&#39;], &#39;年&#39;, $tmp[&#39;month&#39;],
 &#39;月&#39;, $tmp[&#39;day&#39;], &#39;天&#39;, &#39;;&#39;, $tmp[&#39;not_birth&#39;], &#39;<br>&#39;;
}
echo &#39;
'

Output:

/*
  运行结果:
  2015-10-13
  1990-06-12:25年4月1天;0
  1990-07-13:25年3月0天;0
  1990-08-16:25年1月27天;0
  1990-10-10:25年0月3天;0
  1990-10-13:25年0月0天;0
  1990-10-15:24年11月28天;0
  1990-11-9:24年11月4天;0
  1990-11-22:24年10月21天;0
  2016-11-22:1年1月9天;1
  2016-8-22:0年10月9天;1
  2016-10-13:1年0月0天;1
   
 * 
 */


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:PHP format byte sizeNext article:PHP format byte size