首页 >后端开发 >php教程 >计算年龄 精确到天

计算年龄 精确到天

WBOY
WBOY原创
2016-07-25 08:46:371699浏览
用于计算年龄 精确到天
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. class Age {
  7. /**
  8. * 计算年龄精准到年月日
  9. * @param type $birthday
  10. * @return array
  11. */
  12. public function calAge($birthday) {
  13. list($byear, $bmonth, $bday) = explode('-', $birthday);
  14. list($year, $month, $day) = explode('-', date('Y-m-d'));
  15. $bmonth = intval($bmonth);
  16. $bday = intval($bday);
  17. if ($bmonth $bmonth = '0' . $bmonth;
  18. }
  19. if ($bday $bday = '0' . $bday;
  20. }
  21. $bi = intval($byear . $bmonth . $bday);
  22. $ni = intval($year . $month . $day);
  23. $not_birth = 0;
  24. if ($bi > $ni) {
  25. $not_birth = 1;
  26. $tmp = array($byear, $bmonth, $bday);
  27. list($byear, $bmonth, $bday) = array($year, $month, $day);
  28. list($year, $month, $day) = $tmp;
  29. list($bi, $ni) = array($ni, $bi);
  30. }
  31. $years = 0;
  32. while (($bi + 10000) $bi += 10000;
  33. $years++;
  34. $byear++;
  35. }//得到岁数后 抛弃年
  36. list($m, $d) = $this->getMD(array($year, $month, $day), array($byear, $bmonth, $bday));
  37. return array('year' => $years, 'month' => $m, 'day' => $d, 'not_birth' => $not_birth);
  38. }
  39. /**
  40. * 只能用于一年内计算
  41. * @param type $ymd
  42. * @param type $bymd
  43. */
  44. public function getMD($ymd, $bymd) {
  45. list($y, $m, $d) = $ymd;
  46. list($by, $bm, $bd) = $bymd;
  47. if (($m . $d) $m +=12;
  48. }
  49. $month = 0;
  50. while ((($bm . $bd) + 100) $bm++;
  51. $month++;
  52. }
  53. if ($bd $day = $d - $bd;
  54. } else {//少一个月
  55. $mdays = $bm > 12 ? $this->_getMothDay( ++$by, $bm - 12) : $this->_getMothDay($by, $bm);
  56. $day = $mdays - $bd + $d;
  57. }
  58. return array($month, $day);
  59. }
  60. private function _getMothDay($year, $month) {
  61. switch ($month) {
  62. case 1:
  63. case 3:
  64. case 5:
  65. case 7:
  66. case 8:
  67. case 10:
  68. case 12:
  69. $day = 31;
  70. break;
  71. case 2:
  72. $day = (intval($year % 4) ? 28 : 29); //能被4除尽的为29天其他28天
  73. break;
  74. default:
  75. $day = 30;
  76. break;
  77. }
  78. return $day;
  79. }
  80. }
  81. $cage = new Age();
  82. $test = array(
  83. '1990-06-12',
  84. '1990-07-13',
  85. '1990-08-16',
  86. '1990-10-10',
  87. '1990-10-13',
  88. '1990-10-15',
  89. '1990-11-9',
  90. '1990-11-22',
  91. '2016-11-22',
  92. '2016-8-22',
  93. '2016-10-13',
  94. );
  95. echo date('Y-m-d');
  96. echo '
    ';
  97. foreach($test as $v){
  98. $tmp = $cage->calAge($v);
  99. echo $v , ':', $tmp['year'], '年', $tmp['month'],
  100. '月', $tmp['day'], '天', ';', $tmp['not_birth'], '
    ';
  101. }
  102. echo '' ;
  103. /*
  104. 运行结果:
  105. 2015-10-13
  106. 1990-06-12:25年4月1天;0
  107. 1990-07-13:25年3月0天;0
  108. 1990-08-16:25年1月27天;0
  109. 1990-10-10:25年0月3天;0
  110. 1990-10-13:25年0月0天;0
  111. 1990-10-15:24年11月28天;0
  112. 1990-11-9:24年11月4天;0
  113. 1990-11-22:24年10月21天;0
  114. 2016-11-22:1年1月9天;1
  115. 2016-8-22:0年10月9天;1
  116. 2016-10-13:1年0月0天;1
  117. *
  118. */
复制代码


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn