一、代码如下

 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校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄的更多相关文章

  1. Java中校验身份证号合法性(真伪),获取出生日期、年龄、性别、籍贯

    开发过程中有用的身份证号的业务场景,那么校验身份证的合法性就很重要了,另外还有通过身份证获取出生日期.年龄.性别.籍贯等信息, 下面是本人在开发中用到的关于校验身份证真伪的工具类,可以直接拿来使用,非 ...

  2. 教你一招:Excel中使用MID函数获取身份证中的出生年月日

    MID字符串函数,作用是从一个字符串中截取出指定数量的字符 MID(text, start_num, num_chars)   text被截取的字符 start_num从左起第几位开始截取(用数字表达 ...

  3. Js正则校验身份证号码

    原文链接:http://gongwen.sinaapp.com/article-126-cmd 这个其实不难,在网上多找一下总会有意外收获的.但是工欲善其事,必先利其器.我们需要了解一下身份证号的规则 ...

  4. javascript 验证身份证

    /*身份证号码检索*/ function cardCheck(cartNo) { if (cartNo.val() === "") { return false; } else i ...

  5. JS校验身份证号的合法性

    前端表单中有身份证号的校验,下边是用JS来校验身份证号的合法性. 中国居民身份证号码编码规则 第一.二位表示省(自治区.直辖市.特别行政区). 第三.四位表示市(地级市.自治州.盟及国家直辖市所属市辖 ...

  6. JavaScript校验图片格式及大小

    <!DOCTYPE html> <html> <head> <title>JavaScript校验图片格式及大小</title> <s ...

  7. JavaScript校验网址

    JavaScript校验网址 var linkUrl = 'https://www.baidu.com' if( typeof (linkUrl) != undefined && li ...

  8. js 校验身份证号

    根据地区编码.身份证格式.18位身份证需要验证最后一位校验位 //校验身份证 function IdentityCodeValid(code) { var city = { 11: "北京& ...

  9. Android由出生年月日计算年龄(周岁)

    先从String类型的出生日期(“yyyy-MM-dd”)中提取int类型的年.月.日:再计算岁数. 程序如下: /** * 根据出生日期计算年龄的工具类BirthdayToAgeUtil */ pu ...

随机推荐

  1. SpringMVC 请求调用过程

    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个Han ...

  2. 响应json数据之发送ajax的请求

    一.前端异步请求代码: <span style="font-size:14px;">$.ajax ({ type: "POST", //请求的方式 ...

  3. 根据xml文件生成javaBean

    原 根据xml文件生成javaBean 2017年08月15日 18:32:26 吃完喝完嚼益达 阅读数 1727 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出 ...

  4. Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块

    这才是真正的$N\sqrt{N}$吧$qwq$ 记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i ...

  5. react须知

    1. JSX是什么? 1)JSX是一种facebook发明的语法.就是将HTML和JS 可以同时书写.其实是一种js的语法糖. 但是浏览器不能识别,需要通过babel-loader来转译. @babe ...

  6. 使用ice-plugin-fusion给icedesign的模板加个主题(theme)

    最近一直处于半失业状态,好多年没有更新对前端的理解了,闲来看看前端技术的发展.因为一直是个草台班子,身兼多职东看看西看看,一直没太搞清楚iceworks.ant design, fusion等等一堆阿 ...

  7. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C 倒序并查集

    C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. AGC033D Complexity

    题意 给出一个\(n*m\)的\(0,1\)矩阵,若一个矩阵中的所有元素都相同,则这个矩阵的代价为\(0\),如果不是则选择一种将它分成两个子矩阵的方案,代价为所有方案中(两个子矩阵的代价的较大值+\ ...

  9. ACM之路(16)—— 数位DP

    题目就是kuangbin的数位DP. 先讲C题,不要62,差不多就是一个模板题.要注意的是按位来的话,光一个pos是不够的,还需要一维来记录当前位置是什么数字,这样才能防止同一个pos不同数字的dp值 ...

  10. Dubbo系列(二)dubbo的环境搭建

    dubbo是一个分布式服务框架,提供一个SOA的解决方案.简单的说,dubbo就像在生产者和消费者中间架起了一座桥梁,使之能透明交互.本文旨在搭建一个可供使用和测试的dubbo环境,使用了spring ...