当前位置:Gxlcms > PHP教程 > 计算年龄精确到天

计算年龄精确到天

时间:2021-07-01 10:21:17 帮助过:2人阅读

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

人气教程排行