中华人民共和国公民身份证验证和计算方式
我国的公民身份证统一为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); } }
如果有使用请标明来源:http://www.cnblogs.com/duwenlei/