php计算年龄精准到年月日


Posted in PHP onNovember 17, 2015

本文实例讲述了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
 
 * 
 */

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

PHP 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
discuz程序的PHP加密函数原理分析
Aug 05 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
PHP rsa加密解密使用方法
Apr 27 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
php实现简单的上传进度条
Nov 17 #PHP
PHP安装threads多线程扩展基础教程
Nov 17 #PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 #PHP
教大家制作简单的php日历
Nov 17 #PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 #PHP
PHP Yii框架之表单验证规则大全
Nov 16 #PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 #PHP
You might like
php中日期加减法运算实现代码
2011/12/08 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
Yii快速入门经典教程
2015/12/28 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Django日志模块logging的配置详解
2017/02/14 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
python基础教程之while循环
2019/08/14 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
python如何建立全零数组
2020/07/19 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
学生周末长期请假条
2014/02/15 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
宪法宣传标语100条
2019/10/15 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
Mysql案例刨析事务隔离级别
2021/09/25 MySQL