ホームページ  >  記事  >  バックエンド開発  >  PHP は年齢を年、月、日まで正確に計算します

PHP は年齢を年、月、日まで正確に計算します

高洛峰
高洛峰オリジナル
2016-10-20 16:33:131057ブラウズ

この記事では、PHP で年、月、日の精度を計算する方法を主に紹介します。これは、PHP の操作の日付と文字列の関連スキルを含みます。必要な方は参考にしてください。

この記事では、PHP で年、月、日の精度で年齢を計算する方法の例を説明します。皆さんの参考に共有してください。詳細は次のとおりです:

<?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(&#39;-&#39;, $birthday);
    list($year, $month, $day) = explode(&#39;-&#39;, date(&#39;Y-m-d&#39;));
    $bmonth = intval($bmonth);
    $bday = intval($bday);
    if ($bmonth < 10) {
      $bmonth = &#39;0&#39; . $bmonth;
    }
    if ($bday < 10) {
      $bday = &#39;0&#39; . $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(&#39;year&#39; => $years, &#39;month&#39; => $m, &#39;day&#39; => $d, &#39;not_birth&#39; => $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(
  &#39;1990-06-12&#39;,
  &#39;1990-07-13&#39;,
  &#39;1990-08-16&#39;,
  &#39;1990-10-10&#39;,
  &#39;1990-10-13&#39;,
  &#39;1990-10-15&#39;,
  &#39;1990-11-9&#39;,
  &#39;1990-11-22&#39;,
  &#39;2016-11-22&#39;,
  &#39;2016-8-22&#39;,
  &#39;2016-10-13&#39;,
);
echo date(&#39;Y-m-d&#39;);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
foreach($test as $v){
  $tmp = $cage->calAge($v);
  echo $v , &#39;:&#39;, $tmp[&#39;year&#39;], &#39;年&#39;, $tmp[&#39;month&#39;],
 &#39;月&#39;, $tmp[&#39;day&#39;], &#39;天&#39;, &#39;;&#39;, $tmp[&#39;not_birth&#39;], &#39;<br>&#39;;
}
echo &#39;
'

出力:

/*
  运行结果:
  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
   
 * 
 */


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