一、代码如下

 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. 给程序添加git commit信息

    遇到了一个客户程序出问题,自己这边始终无法重现的bug.为了检查问题,查到了一个添加git的commit信息到程序中的方法,感觉对程序版本控制十分好用. 一,项目中添加如下文件 文件结构: GitVe ...

  2. 有关 C# WebAPI知识

    1.[懒得安分博客总结的很全面] 2.关于基础类型作入参数的问题      参照此博客[ASP.NET WebAPI String 传值问题] 3.代码说明     using System; usi ...

  3. learning strrchr func

    函数名称: strrchr 函数原型:char *strrchr(const char *str, char c); 所属库: string.h 函数功能:查找一个字符c在另一个字符串str中末次出现 ...

  4. 下载eclipse 配置eclipse 新建Java项目 写一个小程序 运行

    为了更好的学习java,我打算下载个eclipse 地址:https://www.eclipse.org/downloads/packages/ 我们需要下载的版本是Eclipse IDE for J ...

  5. yolo image.c

    void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabe ...

  6. Linux设备驱动程序 之 Makefile

    典型的模块Makefile如下所示: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?=/lib/modules/$(shell ...

  7. Windows/Linux C/C++任意键继续

    #include <stdio.h> #include <stdlib.h> #ifdef _WIN32 #include <stdlib.h> #else #in ...

  8. elasticsearch+kibana setup

    加载示例数据,设置index的时候出错: 提示 forbidden 则可能是es的问题,需要执行如下命令: curl -XPUT -H "Content-Type: application/ ...

  9. js获取后台传给前台的值

    1.后台传给前台的方法 String rulemodeid=req.getParameter("rulemodeid"); req.setAttribute("rulem ...

  10. react+laravel与服务端渲染的几点思考

    一.前后端完全分离 1.用React.js做MVC中的V,剩下的交给Laravel 2.Laravel用来做API接口开发. 3.好处:实现了前后端开发的分离,从而加快前后端开发效率.另外若是多端的如 ...