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

  我国的公民身份证统一为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);
    }
}
原文地址:https://www.cnblogs.com/duwenlei/p/5359461.html