【通用方法】身份证号校验、获取年龄性别生日(兼容一代二代身份证)

二代身份证正则表达式

/^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/

这段正则表达式用于校验中国二代身份证号码的格式是否正确。其中,身份证号码由18位字符组成,前17位为数字,最后一位可能是数字或字母X。

正则表达式解释如下:

^ 表示匹配字符串的开始位置;
([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]) 表示匹配第1-2位的数字,代表所在省份的代码;
\d{4} 表示匹配第3-6位的数字,代表所在城市的代码;
(([1][9]\d{2})|([2]\d{3})) 表示匹配第7-10位的数字,代表出生年份;
(([0][1-9])|([1][0-2])) 表示匹配第11-12位的数字,代表出生月份;
(([0][1-9])|([1-2][0-9])|([3][0-1])) 表示匹配第13-14位的数字,代表出生日期;
\d{3} 表示匹配第15-17位的数字,代表所在地区的代码;
[0-9xX] 表示匹配第18位的数字或字母X,代表校验位;
$ 表示匹配字符串的结束位置。

一代身份证正则表达式

/^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(\d{2})(0[1-9]|1[0-2])([0-2][1-9]|10|20|30|31])\d{3}$/

这段正则表达式用于校验中国一代身份证号码的格式是否正确。第一代身份证号码是由15位数字组成,前6位是地址码,接下来两位是年份的后两位,再接下来两位是月份,最后两位是日。

正则表达式解释如下:

与二代身份证基本上相同。区别在于:第一代身份证在前 6 位号码后没有完整出生年份,而二代的有完整的出生年份。并且第二代身份证没有最后一位的数字校验码

封装的函数(可直接调用)

传入参数 idcardTest: 身份证号

得到结果: 得到person对象(包含年龄、性别、生日)。若校验失败打印输入的身份证号长度不对,或者号码不符合规定!

具体代码如下所示:

idCardToAgeAndSex(idcardTest) {
	// 一代身份证正则表达式
	let idcardTest1 =
		/^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(\d{2})(0[1-9]|1[0-2])([0-2][1-9]|10|20|30|31])\d{3}$/;
	// 二代身份证正则表达式
	let idcardTest2 =
		/^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;

	// 获取当前时间
	let nowYear = new Date().getFullYear(); //获取当前年份
	let nowMonth = new Date().getMonth(); //获取当前月份

	let person = {
		//最终信息保存于此
		age: "",
		sex: "",
		birthday: "",
	};
	let idYear = 0; //获取身份证年份
	let idMonth = ""; //获取身份证月份
	let idDate = ""; //获取身份证日份
	let sexCheck = ""; //获取身份证性别

	//身份证校验
	if (!uni.$u.test.idCard(idcardTest)) {
		return person;
	} else if (idcardTest1.test(idcardTest)) {
		idYear = Number(idcardTest.slice(6, 8)) + Number(1900); //身份证年份
		idMonth = idcardTest.slice(8, 10); //身份证月份
		idDate = idcardTest.slice(10, 12); //身份证日份
		sexCheck = idcardTest.slice(14, 15); //身份证性别
	} else if (idcardTest2.test(idcardTest)) {
		idYear = idcardTest.slice(6, 10); //身份证年份
		idMonth = idcardTest.slice(10, 12); //身份证月份
		idDate = idcardTest.slice(12, 14); //身份证日份
		sexCheck = idcardTest.slice(16, 17); //身份证性别
	}

	// 年龄计算
	if (nowMonth - idMonth >= 0) {
		person.age = String(nowYear - idYear);
	} else {
		person.age = String(nowYear - idYear - 1);
	}
	// 生日拼接
	person.birthday = idYear + "-" + idMonth + "-" + idDate;
	// 性别判断
	if (sexCheck % 2 == 0) {
		person.sex = "女";
	} else {
		person.sex = "男";
	}
	return person;
},
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值