php实现根据身份证获取年龄的函数

33 篇文章 0 订阅

实现通过php根据身份证获取出生年月日和年龄的函数

一、通过身份证号获取出生年月日的方法

# 1.从身份证中获取出生日期
$stridbirthday = substr($idno, 6, 8);//idno是身份证号 截取日期并转为时间戳
$birthday = substr(stridbirthday,0,4).'-'. substr(stridbirthday,4,2).'-'. substr(stridbirthday,6,2);

二、检测身份证格式并计算年龄

function getAgeFromIdNo($idno=''){
     if(!isIdno($idno)){
        return false; 
     }     
     
     $btime = strtotime(substr($idno, 6, 8));//idno是身份证号 截取日期并转为时间戳
     $byear =date('Y',$btime );
     $bmonth =date('m',$btime );
     $bday =date('d',$btime );
     $curYear=date('Y');
     $curMoth = date('m');
     $curDay = date('d');
     $age = $curYear - $byear;
     if( $curMoth < $bmonth || ($curMoth ==$bmonth && $curDay < $bday)){
        $age--;
     }
     return $age;    

}


//验证省份证格式是否正确
function isIdno($id){
	$id = strtoupper($id);
	$regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
	$arr_split = array();
	if(!preg_match($regx, $id)){
		return false;
	}
	if(15==strlen($id)){//检查15位
		$regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";
		@preg_match($regx, $id, $arr_split);
		//检查生日日期是否正确
		$dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
		if(!strtotime($dtm_birth)) {
			return false;
		}else{
			return true;
		}
	}else{//检查18位
		$regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
		@preg_match($regx, $id, $arr_split);
		$dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
		if(!strtotime($dtm_birth)){//检查生日日期是否正确
			return false;
		}else{
			//检验18位身份证的校验码是否正确。
			//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
			$arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
			$arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
			$sign = 0;
			for ( $i = 0; $i < 17; $i++ ) {
				$b = (int) $id{$i};
				$w = $arr_int[$i];
				$sign += $b * $w;
			}
			$n = $sign % 11;
			$val_num = $arr_ch[$n];
			if ($val_num != substr($id,17, 1)) {
				return false;
			}else{
				return true;
			}
		}
	}
}

如有问题,欢迎大家留言沟通,点赞支持!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北漂燕郊杨哥

您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值