您的位置:首页 > 其它

中华人民共和国公民身份证验证和计算方式

2016-04-06 15:18 387 查看
  我国的公民身份证统一为18为数字,按照地址码+生日+顺序码+校验码组成。

  123456 19991111 111 4

地址码 生日 顺序码 校验码

地址码指的是公民常住户口所在县(市、镇、区)的行政区划代码,如110102是北京市西城区。

出生日期码表示公民出生的公历年(4位)、月(2位)、日(2位)。

顺序码是给同地址码同出生日期码的人编定的顺序号,其中奇数分配给男性,偶数分配给女性。

最后一位是校验码,这里采用的是ISO 7064:1983,MOD 11-2校验码系统。校验码为一位数,但如果最后采用校验码系统计算的校验码是“10”,碍于身份证号码为18位的规定,则以“X”代替校验码“10”。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
* 校验身份证号
* Created by duwenlei on 2016/4/6.
* 123456 19991111  444   1
*  区码    生日   顺序码 校验码
*
*  其中校验码通过计算得出
*/
public class TestIdNumValidation {

public static String validationNum(String idNum){

String birthDayStr = idNum.substring(6,14);
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");

try{
Date birthDay = sf.parse(birthDayStr);

Calendar calendar = new GregorianCalendar();
calendar.setTime(birthDay);

if(calendar.get(Calendar.YEAR)<1900 || birthDay.after(new Date())){
throw new RuntimeException("身份证生日时间错误");
}

String tempBirthDay = sf.format(birthDay);

if(!birthDayStr.equals(tempBirthDay)){
throw new RuntimeException("省份证生日时间错误");
}
}catch (Exception e){
e.printStackTrace();
}

char[] chs = idNum.toCharArray();

int sum = 0;

for (int i = 0 ; i < chs.length ; i++){

int j = Integer.parseInt(Character.toString(chs[i]));

sum += j * (Math.pow(2,17-i) % 11);

}

int x = (12 - sum % 11) % 11;

return x == 10 ? "X" : x + "";
}

public static void main(String[] args) {

String idNumStr = "150***************";

assert idNumStr != null;

if (idNumStr.length() != 18) {
throw new RuntimeException("身份证号位数错误");
}

String idNumSubStr = idNumStr.substring(0, idNumStr.length() - 1);

Long.parseLong(idNumSubStr);

String lastStr = idNumStr.substring(idNumStr.length() - 1).toUpperCase();

System.out.println(lastStr.equals(validationNum(idNumSubStr)));

System.out.println(65536%11);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: