如何用php计算年龄精准到年月日?

2017-02-28 1211 5 编辑:深圳网站建设 来源:互联网

这篇文章主要介绍了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('-', $birthday);

    list($year, $month, $day) = explode('-', date('Y-m-d'));

    $bmonth = intval($bmonth);

    $bday = intval($bday);

    if ($bmonth < 10) {

      $bmonth = '0' . $bmonth;

    }

    if ($bday < 10) {

      $bday = '0' . $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('year' => $years, 'month' => $m, 'day' => $d, 'not_birth' => $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(

  '1990-06-12',

  '1990-07-13',

  '1990-08-16',

  '1990-10-10',

  '1990-10-13',

  '1990-10-15',

  '1990-11-9',

  '1990-11-22',

  '2016-11-22',

  '2016-8-22',

  '2016-10-13',

);

echo date('Y-m-d');

echo '<pre>';

foreach($test as $v){

  $tmp = $cage->calAge($v);

  echo $v , ':', $tmp['year'], '年', $tmp['month'],

 '月', $tmp['day'], '天', ';', $tmp['not_birth'], '<br>';

}

echo '</pre>'

输出:

/*

  运行结果:

  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  

 * 

 */

专业的网站建设公司,深正互联,如您有网站营销需求,请您关注我们,或者致电13828884598

本站文章均为深正网站建设摘自权威资料,书籍,杂志或原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享到社交网站,引用和转载,我们谢绝直接复制和抄袭!感谢您...

学习课堂

15个常用的javaScript正则表达式

收集整理了15个常用的javaScript正则表达式,其中包括用户名、密码强度、整数、数字、电子邮件地址(Email)、手机号码、身份证号、URL地址、 IPv4地址...

2017-11-04
2017-03-17
2017-06-21
2017-07-17

动态更新

【通知】域名注册补交/提交审核资料通知

接到.com/.net域名注册局Verisign维护通知要求:所有的.com/.net的注册需要尽快提交实名制验证资料。 个人注册,请提供个人身份证件信息,企业注册,请提供营业执照资料,而非企业之组织单位,请提供组织结构代码证件,三证合一请提供营业执照即可...

2017-06-14
2017-01-14
2017-08-07
2017-06-14

资讯知识

教你如何写一篇公众号里愿意被分享的文章?

许多企业又或者是微商在运营微信公众号时,采用的最普遍的方式之一是写文章,深圳网站建设通过文章引起用户的注意,并利用文章来吸引用户主动转发和传播,但是怎么写一篇文章,才能让它在公众号里愿意被分享呢...

>2016-07-21
>2016-07-06
>2016-07-12
>2017-07-05
亲,请您联系我们吧

您的疑问,只要您主动联系,将为您得到最专业,最全面的解答,欢迎您询问...