<?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 * */ |