JavaScript校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄
一、代码如下
let 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 arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
let birth = ''
// 检查号码是否符合规范,包括长度,类型
function isCardNo (card) {
// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
return /(^\d{15}$)|(^\d{17}(\d|X)$)/.test(card)
}
// 取身份证前两位,校验省份
function checkProvince (card) {
let province = card.substr(0, 2)
return vcity[province] !== undefined
// return true
}
// 检查生日是否正确
function checkBirthday (card) {
let len = card.length
var arrdata, year, month, day, birthday
// 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if (len === 15) {
let refifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/
arrdata = card.match(refifteen)
year = arrdata[2]
month = arrdata[3]
day = arrdata[4]
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 reeighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
arrdata = card.match(reeighteen)
year = arrdata[2]
month = arrdata[3]
day = arrdata[4]
birthday = new Date(year + '/' + month + '/' + day)
// console.log(birthday)
return verifyBirthday(year, month, day, birthday)
}
return false
}
// 校验日期
function verifyBirthday (year, month, day, birthday) {
birth = `${year}-${month}-${day}`
var now = new Date()
var nowyear = now.getFullYear()
// 年月日是否合理
if (birthday.getFullYear() === +year && (birthday.getMonth() + 1) === +month && birthday.getDate() === +day) {
// 判断年份的范围(3岁到150岁之间)
var time = nowyear - year
if (time >= 3 && time <= 150) {
return true
}
return false
}
return false
}
// 校验位的检测
function checkParity (card) {
// 15位转18位
card = changeFivteenToEighteen(card)
var len = card.length
var valnum
var cardTemp = 0
if (len === 18) {
for (let 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
}
function changeFivteenToEighteen (card) {
var cardTemp = 0
if (card.length === 15) {
card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6)
for (let i = 0; i < 17; i++) {
cardTemp += card.substr(i, 1) * arrInt[i]
}
card += arrCh[cardTemp % 11]
return card
}
return card
}
function getSex (card) {
let sex = 0
let sexNo = 0
if (card.length === 18) {
sexNo = card.substring(16, 17)
} else if (card.length === 15) {
sexNo = card.substring(14, 15)
}
sex = sexNo % 2
if (sex === 0) {
sex = 2
}
return sex
}
export function getAge (card) {
if (card === null) return null
let len = card.length
var arrdata, year, month, day, age
var myDate = new Date()
var nowY = myDate.getFullYear()
var nowM = myDate.getMonth() + 1
var nowD = myDate.getDate() // 获取当前日(1-31)
if (len === 15) {
let refifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/
arrdata = card.match(refifteen)
year = arrdata[2]
month = arrdata[3]
day = arrdata[4]
if (nowM > month || (nowM === month && nowD >= day)) { age = nowY - year } else { age = nowY - year - 1 }
}
if (len === 18) {
var reeighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
arrdata = card.match(reeighteen)
year = arrdata[2]
month = arrdata[3]
day = arrdata[4]
if (nowM > month || (nowM === month && nowD >= day)) { age = nowY - year } else { age = nowY - year - 1 }
}
if (age < 0) return null
else return age
}
export function checkIDcard (card) {
let errNo = 0
if (card === '') {
errNo = 1
} else if (isCardNo(card) === false) {
errNo = 2
} else if (checkProvince(card) === false) {
errNo = 3
} else if (checkBirthday(card) === false) {
errNo = 4
} else if (checkParity(card) === false) {
errNo = 5
}
return {errno: errNo, birthday: birth, gender: getSex(card), age: getAge(card)}
}
在外部主要使用checkIDCard方法即可。
JavaScript校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄的更多相关文章
- Java中校验身份证号合法性(真伪),获取出生日期、年龄、性别、籍贯
开发过程中有用的身份证号的业务场景,那么校验身份证的合法性就很重要了,另外还有通过身份证获取出生日期.年龄.性别.籍贯等信息, 下面是本人在开发中用到的关于校验身份证真伪的工具类,可以直接拿来使用,非 ...
- 教你一招:Excel中使用MID函数获取身份证中的出生年月日
MID字符串函数,作用是从一个字符串中截取出指定数量的字符 MID(text, start_num, num_chars) text被截取的字符 start_num从左起第几位开始截取(用数字表达 ...
- Js正则校验身份证号码
原文链接:http://gongwen.sinaapp.com/article-126-cmd 这个其实不难,在网上多找一下总会有意外收获的.但是工欲善其事,必先利其器.我们需要了解一下身份证号的规则 ...
- javascript 验证身份证
/*身份证号码检索*/ function cardCheck(cartNo) { if (cartNo.val() === "") { return false; } else i ...
- JS校验身份证号的合法性
前端表单中有身份证号的校验,下边是用JS来校验身份证号的合法性. 中国居民身份证号码编码规则 第一.二位表示省(自治区.直辖市.特别行政区). 第三.四位表示市(地级市.自治州.盟及国家直辖市所属市辖 ...
- JavaScript校验图片格式及大小
<!DOCTYPE html> <html> <head> <title>JavaScript校验图片格式及大小</title> <s ...
- JavaScript校验网址
JavaScript校验网址 var linkUrl = 'https://www.baidu.com' if( typeof (linkUrl) != undefined && li ...
- js 校验身份证号
根据地区编码.身份证格式.18位身份证需要验证最后一位校验位 //校验身份证 function IdentityCodeValid(code) { var city = { 11: "北京& ...
- Android由出生年月日计算年龄(周岁)
先从String类型的出生日期(“yyyy-MM-dd”)中提取int类型的年.月.日:再计算岁数. 程序如下: /** * 根据出生日期计算年龄的工具类BirthdayToAgeUtil */ pu ...
随机推荐
- 计算机网络|C语言Socket编程,实现两个程序间的通信
C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图
- 洛谷P1006 传纸条【dp】
题目:https://www.luogu.org/problemnew/show/P1006 题意: 给定一个m*n的矩阵,从(1,1)向下或向右走到(m,n)之后向上或向左走回(1,1),要求路径中 ...
- 01_初识redis
1.redis和mysql mysql是一个软件,帮助开发者对一台机器的硬盘进行操作. redis是一个软件,帮助开发者对一台机器的内存进行操作 汽车之家,如果硬盘挂掉了,页面还能访问1个月 关键字: ...
- DP(第一版)
序 任何一种具有递推或者递归形式的计算过程,都叫做动态规划 如果你一开始学的时候就不会DP,那么你在考试的时候就一定不会想到用动态规划! 需要进行掌握的内容 1)DP中的基本概念 2)状态 3)转移方 ...
- Python爬虫 Urllib库的基本使用
1.构造Requset 其实上面的urlopen参数可以传入一个request请求,它其实就是一个Request类的实例,构造时需要传入Url,Data等等的内容.比如上面的两行代码,我们可以这么改写 ...
- Codeforces 1009 F. Dominant Indices(长链剖分/树上启发式合并)
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复 ...
- Java通过过滤器修改header
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- mybatis 批量将list数据插入到数据库
随着业务需要,有时我们需要将数据批量添加到数据库,mybatis提供了将list集合循环添加到数据库的方法.具体实现代码如下: 1.mapper层中创建 insertForeach(List < ...
- 自动化测试 | 好用的自动化测试工具Top 10
欲善其事必先利其器,本文从软件测试人员痛点出发,介绍如何先从工具选择上取得优势,在有限的时间内完成工作.经常有人在公众号留言或是后台咨询,做自动化测试用哪个工具好,或是学哪门编程语言好呢? 这个时候总 ...
- 如何使用git send-email发送补丁?
答: git send-email <patch-name> --to <username>@<example>.com --cc <username> ...