php计算年龄精准到年月日

本文实例讲述了PHP计算年龄精准到年月日的方法分享给大家供大家参考。具体如下:

rush:PHP;"> 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,$bday);
list($byear,$bday) = array($year,$day);
list($year,$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,$day),array($byear,$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 '

';
foreach($test as $v){
$tmp = $cage->calAge($v);
echo $v,':',$tmp['year'],'年',$tmp['month'],'月',$tmp['day'],'天',';',$tmp['not_birth'],'
';
}
echo '
' ;

/*
运行结果:
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

  • */

希望本文所述对大家学习PHP程序设计有所帮助。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...