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 ...
随机推荐
- .net core 自动注入。。。。懵逼。。
using Microsoft.AspNetCore.Http; using System.Globalization; using System.Threading.Tasks; namespace ...
- 2、CString与string借助char *互转
CString是MFC中的类,MFC前端界面中获得的字符串是CString类.标准C/C++库函数是不能直接对CString类型进行操作的. string是C++中的类. 安全性 CString &g ...
- 用JavaScript实现快排
啥是快排这里就不讲了,主要还是把原来c++学的东西抓紧转化过来 快排运用的是分而治之的思想,确定一个中值,把大的放右边,小的放左边,然后再左右分别对左右的左右(雾)进行处理 需要注意的一点是,这玩意远 ...
- vue项目实现详情页后退缓存之前的数据
vue项目实现详情页后退缓存之前的数据 2019年02月19日 14:54:57 不想写代码的程序员 阅读数:244 一.需要缓存的内容: 1.后退缓存条件查询的数据 2.后退缓存分页信息 二.实 ...
- luogu 3698 [CQOI2017]小Q的棋盘 树形dp
Code: #include <bits/stdc++.h> #define N 107 #define setIO(s) freopen(s".in","r ...
- java学习第一天:环境的配置
1.下载JDK,当前版本下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htm ...
- neo4j︱与python结合的py2neo使用教程
—- 目前的几篇相关:—– neo4j︱图数据库基本概念.操作罗列与整理(一) neo4j︱Cypher 查询语言简单案例(二) neo4j︱Cypher完整案例csv导入.关系联通.高级查询(三) ...
- IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(二)
上一篇我成功搭建了一个项目,名叫bale-project,下面我们继续搭建子模块. 在项目名称上右键,New->Module,新建一个模块. 这次我们选择Spring Initializr 起个 ...
- SpringMVC支持跨域请求
一.如果项目中使用的SpringMVC4.3.9以下,就需要对该请求配置Filter,设置请求头可支持跨域.使用方法: --spring cloud zuul支持跨域---:https://blog. ...
- QT 多线程程序设计 -互斥
QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接.这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编 ...