身份证号校验,获取年龄,性别,出生日期,出生省份

最近整理了项目中的身份证号的校验插件,在此记录一下,共勉:
1.身份证号是否合法校验:

//弹窗
import { Toast } from "mint-ui";
let instance = null;
const showToast = tip => {
	if(instance) {
		instance.close();
	}
	instance = Toast({
		message: tip,
		duration: 2000
	});
}

//开始校验,调取showVerifyIDTip 时传递的tip为提示语,value为身份证号
const showVerifyIDTip = function(value, tip) {
	if(value.length == "15" || value.length > 18) {
		showToast(tip)
		return false;
	}
	//是否为空
	if(value === "") {
		showToast(tip)
		return false;
	}
	//校验长度,类型
	if(isCardNo(value) === false) {
		showToast(tip)
		return false;
	}
	//检查省份
	if(checkProvince(value) === false) {
		showToast(tip)
		return false;
	}
	//校验生日
	if(checkBirthday(value) === false) {
		showToast(tip)
		return false;
	}
	//检验位的检测
	if(checkParity(value) === false) {
		showToast(tip)
		return false;
	}
	return true;
};

//检查号码是否符合规范,包括长度,类型
const isCardNo = function(card) {
	//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
	var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
	if(reg.test(card) === false) {
		return false;
	}
	return true;
};
var vcity = {
	11: "北京",
	12: "天津",
	13: "河北",
	14: "山西",
	15: "内蒙古",
	21: "辽宁",
	22: "吉林",
	23: "黑龙江",
	31: "上海",
	32: "江苏",
	33: "浙江",
	34: "安徽",
	35: "福建",
	36: "江西",
	37: "山东",
	41: "河南",
	42: "湖北",
	43: "湖南",
	44: "广东",
	45: "广西",
	46: "海南",
	50: "重庆",
	51: "四川",
	52: "贵州",
	53: "云南",
	54: "西藏",
	61: "陕西",
	62: "甘肃",
	63: "青海",
	64: "宁夏",
	65: "新疆",
	71: "台湾",
	81: "香港",
	82: "澳门",
	91: "国外"
};
//取身份证前两位,校验省份
const checkProvince = function(card) {
	var province = card.substr(0, 2);
	if(vcity[province] == undefined) {
		return false;
	}
	return true;
};
const checkBirthday = function(card) {
	var len = card.length;
	//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
	if(len == "15") {
		var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
		var arr_data = card.match(re_fifteen);
		var year = arr_data[2];
		var month = arr_data[3];
		var day = arr_data[4];
		var birthday = new Date("19" + year + "/" + month + "/" + day);
		return verifyBirthday("19" + year, month, day, birthday);
	}
	//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
	if(len == "18") {
		var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
		var arr_data = card.match(re_eighteen);
		var year = arr_data[2];
		var month = arr_data[3];
		var day = arr_data[4];
		var birthday = new Date(year + "/" + month + "/" + day);
		return verifyBirthday(year, month, day, birthday);
	}
	return false;
};
//校验日期
const verifyBirthday = function(year, month, day, birthday) {
	var now = new Date();
	var now_year = now.getFullYear();
	//年月日是否合理
	if(
		birthday.getFullYear() == year &&
		birthday.getMonth() + 1 == month &&
		birthday.getDate() == day
	) {
		//判断年份的范围(3岁到100岁之间)
		var time = now_year - year;
		if(time >= 0 && time <= 100) {
			return true;
		}
		return false;
	}
	return false;
};
//校验位的检测
const checkParity = function(card) {
	//15位转18位
	card = changeFivteenToEighteen(card);
	var len = card.length;
	if(len == "18") {
		var arrInt = new Array(
			7,
			9,
			10,
			5,
			8,
			4,
			2,
			1,
			6,
			3,
			7,
			9,
			10,
			5,
			8,
			4,
			2
		);
		var arrCh = new Array(
			"1",
			"0",
			"X",
			"9",
			"8",
			"7",
			"6",
			"5",
			"4",
			"3",
			"2"
		);
		var cardTemp = 0,
			i,
			valnum;
		for(i = 0; i < 17; i++) {
			cardTemp += card.substr(i, 1) * arrInt[i];
		}
		valnum = arrCh[cardTemp % 11];
		if(valnum == card.substr(17, 1)) {
			return true;
		}
		return false;
	}
	return false;
};
//15位转18位身份证号
const changeFivteenToEighteen = function(card) {
	if(card.length == "15") {
		var arrInt = new Array(
			7,
			9,
			10,
			5,
			8,
			4,
			2,
			1,
			6,
			3,
			7,
			9,
			10,
			5,
			8,
			4,
			2
		);
		var arrCh = new Array(
			"1",
			"0",
			"X",
			"9",
			"8",
			"7",
			"6",
			"5",
			"4",
			"3",
			"2"
		);
		var cardTemp = 0,
			i;
		card = card.substr(0, 6) + "19" + card.substr(6, card.length - 6);
		for(i = 0; i < 17; i++) {
			cardTemp += card.substr(i, 1) * arrInt[i];
		}
		card += arrCh[cardTemp % 11];
		return card;
	}
	return card;
};

2. 身份证号获取性别:

const analyzeIDSex = function(IDCard) {
	var sex = "";
	//获取用户身份证号码  
	var userCard = IDCard;
	//如果身份证号码为undefind则返回空  
	if(!userCard) {
		return sex;
	}
	//获取性别  
	if(parseInt(userCard.substr(16, 1)) % 2 == 1) {
		sex = '男'
	} else {
		sex = '女'
	}
	return sex;
}

3.根据身份证号计算年龄:

const analyzeIDCard = function(IDCard) {
	var sexAndAge = {};
	//获取用户身份证号码  
	var userCard = IDCard;
	//如果身份证号码为undefind则返回空  
	if(!userCard) {
		return sexAndAge;
	}
	if(IDCard.length < 11) {
		tipToast("请输入有效的身份证号!");
		return sexAndAge;
	}

	//获取出生年月日  
	var yearBirth = Number(userCard.substring(6, 10));
	var monthBirth = Number(userCard.substring(10, 12));
	var dayBirth = Number(userCard.substring(12, 14));
	//获取当前年月日并计算年龄  
	var myDate = new Date();
	var monthNow = myDate.getMonth() + 1;
	var dayNow = myDate.getDate();
	var age = myDate.getFullYear() - yearBirth;
	if(monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)) {
		age--;
	}
	//得到年龄  
	sexAndAge.age = age;
	if(sexAndAge.age < 1) {
		let birthDate = new Date(yearBirth + '/' + monthBirth + '/' + dayBirth);
		let nowDate = new Date();
		let days = ((nowDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24));
		return(days.toFixed(2)) / 365;
	} else {
		//返回年龄  
		return sexAndAge.age;
	}

};

4.根据出生日期计算出年龄(1993-06-23):

const jsGetAge = function(strBirthday){
    var returnAge;
    if(!strBirthday){return}
    var strBirthdayArr=strBirthday.split("-");
    var birthYear = strBirthdayArr[0];
    var birthMonth = strBirthdayArr[1];
    var birthDay = strBirthdayArr[2];

    let d = new Date();
    var nowYear = d.getFullYear();
    var nowMonth = d.getMonth() + 1;
    var nowDay = d.getDate();

    if(nowYear == birthYear){
        returnAge = 0;//同年 则为0岁
    }else{
        var ageDiff = nowYear - birthYear ; //年之差
        if(ageDiff > 0){
            if(nowMonth == birthMonth) {
                var dayDiff = nowDay - birthDay;//日之差
                if(dayDiff < 0){
                    returnAge = ageDiff - 1;
                }else{
                    returnAge = ageDiff ;
                }
            }else{
                var monthDiff = nowMonth - birthMonth;//月之差
                if(monthDiff < 0){
                    returnAge = ageDiff - 1;
                }else{
                    returnAge = ageDiff ;
                }
            }
        }else{
            returnAge = -1;//返回-1 表示出生日期输入错误 晚于今天
        }
    }
    return returnAge;//返回周岁年龄

};

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值