https://github.com/oxcow/id-number-validator

15位身份证号码编码规则

  1. ​ddddddyymmddxxp​
  2. dddddd: 地区码
  3. yymmdd: 出生年月日
  4. xx: 顺序类编码,无法确定
  5. p: 性别。奇数位男,偶数为女

18位身份证号码编码规则

  1. ​ddddddyyyymmddxxxy​
  2. dddddd: 地区码
  3. yyyymmdd: 出生年月日
  4. xxx:顺序类编码,无法确定。奇数为男,偶数为女
  5. y: 校验位。可通过前17位计算获取

校验规则

  1. 加权因子Wi
    从右到左依次定义为:

Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]

  1. 校验位值

Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]

  1. 其中 10 身份证中用 X 替代。
  2. 校验位位置

Y_P = mod(Σ(Ai+Wi),11)

  1. 其中下标 i 为身份证号码 从右往左 的 2…8 位; Ai为身份证号对应位数值。
    该公式表示将身份证的前17位与其对应的加权因子 Wi 相乘并求和,再将得到的结果与 11 求模,所得的结果即为校验位值所在的位置。然后直接在校验位值 Y 中查找即可得到校验位值.

比如有一为 330304197002051590 的身份证号,那么最后一位校验位 0 的验证过程如下:

  1. 加权求和
    3×7 + 3×9 + 0×10 + 3×5 + 0×8 + 4×4 + 1×2 + 9×1 + 7×6 + 0×3 + 0×7 + 2×9 + 0×10 + 5×5 + 1×8 + 5×4 + 9×2 = 221
  2. 求模
    221 % 11 = 1
  3. 获取验证位数值
    Y[1] = 0

javascript编码实现

针对上述身份证生成规则的描述,在验证时针对15位身份证号只需要判断其出生日期是否正确即可;而针对18位身份证号,除了验证出生日期外还需要对最后的校验位进行验证。

因此我们命名一个名为​​getIdCardInfo​​的函数,接受身份证号作为参数进行验证。该函数返回身份证信息对象。该对象具有5个属性,分别为:

  1. isTrue : 身份证号是否有效。默认为 false
  2. year : 出生年。默认为null
  3. month : 出生月。默认为null
  4. day : 出生日。默认为null
  5. isMale : 是否为男性。默认false
  6. isFemale : 是否为女性。默认false

源代码

您可进入​​该项目的GitHub页​​进行下载或贡献

​​function(cardNo){​​
​​var={​​
​​:false,​​
​​:null,​​
​​:null,​​
​​:null,​​
​​:false,​​
​​:false​​
​​};​​
​​if(!cardNo ||(15!=.length &&18!=.length)){​​
​​.isTrue =false;​​
​​return;​​
​​}​​
​​if(15==.length){​​
​​var=.substring(6,8);​​
​​var=.substring(8,10);​​
​​var=.substring(10,12);​​
​​var=.substring(14,15);//性别位​​
​​var=newDate(year,(month)-1,​​
​​(day));​​
​​// 对于老身份证中的年龄则不需考虑千年虫问题而使用getYear()方法 ​​
​​if(birthday.getYear()!=(year)​​
​​||.getMonth()!=(month)-1​​
​​||.getDate()!=(day)){​​
​​.isTrue =false;​​
​​}else{​​
​​.isTrue =true;​​
​​.year =.getFullYear();​​
​​.month =.getMonth()+1;​​
​​.day =.getDate();​​
​​if(p %2==0){​​
​​.isFemale =true;​​
​​.isMale =false;​​
​​}else{​​
​​.isFemale =false;​​
​​.isMale =true​​
​​}​​
​​}​​
​​return;​​
​​}​​
​​if(18==.length){​​
​​var=.substring(6,10);​​
​​var=.substring(10,12);​​
​​var=.substring(12,14);​​
​​var=.substring(14,17)​​
​​var=newDate(year,(month)-1,​​
​​(day));​​
​​// 这里用getFullYear()获取年份,避免千年虫问题​​
​​if(birthday.getFullYear()!=(year)​​
​​||.getMonth()!=(month)-1​​
​​||.getDate()!=(day)){​​
​​.isTrue =false;​​
​​return;​​
​​}​​
​​varWi=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1];// 加权因子 ​​
​​var=[1,0,10,9,8,7,6,5,4,3,2];// 身份证验证位值.10代表X ​​
​​// 验证校验位​​
​​var=0;// 声明加权求和变量​​
​​var=.split("");​​

​​if(_cardNo[17].toLowerCase()=='x'){​​
​​[17]=10;// 将最后位为x的验证码替换为10方便后续操作 ​​
​​}​​
​​for(var=0;<17;++){​​
​​+=Wi[i]*[i];// 加权求和 ​​
​​}​​
​​var=%11;// 得到验证码所位置​​

​​if(_cardNo[17]!=[i]){​​
​​return.isTrue =false;​​
​​}​​
​​.isTrue =true;​​
​​.year =.getFullYear();​​
​​.month =.getMonth()+1;​​
​​.day =.getDate();​​
​​if(p %2==0){​​
​​.isFemale =true;​​
​​.isMale =false;​​
​​}else{​​
​​.isFemale =false;​​
​​.isMale =true​​
​​}​​
​​return;​​
​​}​​
​​return;​​
​​}​​

验证示例

 验证

​http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/​