ホームページ  >  記事  >  バックエンド開発  >  年齢を最も近い日まで計算します

年齢を最も近い日まで計算します

WBOY
WBOYオリジナル
2016-07-25 08:46:371669ブラウズ
年龄精确から天までの計算に使用されます
  1. /*
  2. * このライセンス ヘッダーを変更するには、プロジェクト プロパティで [ライセンス ヘッダー] を選択します。
  3. * このテンプレート ファイルを変更するには、[ツール] | [ライセンス ヘッダー] を選択します。テンプレート
  4. * エディタでテンプレートを開きます。
  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. * 1年以内の計算にのみ使用できます
  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) $ m +=12;
  51. }
  52. $month = 0;
  53. while ((($bm . $bd) + 100) <= ($m . $d)) {
  54. $bm++;
  55. $month++;
  56. }
  57. if ($bd <= $d) {//同处一月
  58. $day = $d - $bd;
  59. } else {//少一月
  60. $mdays = $bm > 12? $this->_getMothDay( ++$by, $bm - 12) : $this->_getMothDay($by, $bm);
  61. $day = $mdays - $bd + $d;
  62. }
  63. 配列を返します($month, $day);
  64. }
  65. プライベート関数 _getMothDay($year, $month) {
  66. switch ($month) {
  67. ケース 1:
  68. ケース 3:
  69. ケース 5:
  70. ケース 7:
  71. ケース 8:
  72. ケース 10:
  73. ケース 12:
  74. $day = 31;
  75. ブレーク;
  76. ケース 2:
  77. $day = (intval($year % 4) ? 28 : 29); //能被4除尽為29日その他28天
  78. break;
  79. default:
  80. $day = 30;
  81. Break;
  82. }
  83. return $day;
  84. }
  85. }
  86. $cage = new Age() ;
  87. $test = array(
  88. '1990-06-12',
  89. '1990-07-13',
  90. '1990-08-16',
  91. '1990-10-10',
  92. '1990-10-13 '、
  93. '1990-10-15'、
  94. '1990-11-9'、
  95. '1990-11-22'、
  96. '2016-11-22'、
  97. '2016-8-22'、
  98. '2016 -10-13',
  99. );
  100. echo date('Y-m-d');
  101. echo '
    ';</li>
    <li>foreach($test as $v){</li>
    <li> $tmp = $cage->calAge( $v);</li>
    <li> echo $v , ':', $tmp['year'], '年', $tmp['month'],</li>
    <li> '月', $tmp['day'], '天', ';', $tmp['not_birth'], '<br>';</li>
    <li>}</li>
    <li>echo '
    ' ;
  102. /*
  103. 运行结果:
  104. 2015-10-13
  105. 1990-06-12:25年4月1日;0
  106. 1990-07-13:25年3月0天;0
  107. 1990-08 -16:25年1月27日;0
  108. 1990-10-10:25年0月3日;0
  109. 1990-10-13:25年0月0天;0
  110. 1990-10-15:24年11月28日;0
  111. 1990-11-9:24年11月4日;0
  112. 1990-11-22:24年10月21日;0
  113. 2016-11-22:1年1月9日; 1
  114. 2016-8-22:0年10月9天;1
  115. 2016-10-13:1年0月0天;1
  116. *
  117. */
复制發


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。