首页 > 开发 > PHP > 正文

php计算年龄精准到年月日

2024-05-04 23:40:28
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了php计算年龄精准到年月日的方法,涉及php操作日期与字符串的相关技巧,非常简单实用,需要的朋友可以参考下

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

 

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

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


注:相关教程知识阅读请移步到PHP教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表