当前位置 : 主页 > 网络编程 > PHP >

计算年龄 精确到天

来源:互联网 收集:自由互联 发布时间:2021-06-30
?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 { /** * 计算年龄精准到年月日 * @pa
 
<?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('-', $birthday);
        list($year, $month, $day) = explode('-', date('Y-m-d'));
        $bmonth = intval($bmonth);
        $bday = intval($bday);
        if ($bmonth < 10) {
            $bmonth = '0' . $bmonth;
        }
        if ($bday < 10) {
            $bday = '0' . $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('year' => $years, 'month' => $m, 'day' => $d, 'not_birth' => $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(
    '1990-06-12',
    '1990-07-13',
    '1990-08-16',
    '1990-10-10',
    '1990-10-13',
    '1990-10-15',
    '1990-11-9',
    '1990-11-22',
    '2016-11-22',
    '2016-8-22',
    '2016-10-13',
);
echo date('Y-m-d');
echo '<pre>';
foreach($test as $v){
    $tmp = $cage->calAge($v);
    echo $v , ':', $tmp['year'], '年', $tmp['month'],
 '月', $tmp['day'], '天', ';', $tmp['not_birth'], '<br>';
}
echo '</pre>' ;
  
  
/*
    运行结果:
    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
  
 * 
 */

网友评论