快捷搜索:

Java的身份证号码工具类,java验证身份证号码及编码规则和提取相应信息

2019-11-13 09:57栏目:关于澳门金莎
TAG:

实现从15位~18位的身份证号码转换,校验中国大陆公民身份证、香港居民身份证、澳门身份证和台湾身份证。```java package my.tools; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; / * 身份证工具类 @author June * @version 1.0, 2010-06-17* / public class IdcardUtils extends StringUtils { / 中国公民身份证号码最小长度。 / public static final int CHINA_ID_MIN_LENGTH = 15; / **中国公民身份证号码最大长度。 / public static final int CHINA_ID_MAX_LENGTH = 18; / 省、直辖市代码表* / public static final String cityCode[] = { "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" }; /每位加权因子 */ public static final int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; / 第18位校检码 */ public static final String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; / 最低年限 */ public static final int MIN = 1930; public static Map<String, String> cityCodes = new HashMap<String, String>(); / 台湾身份首字母对应数字* / public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>(); / 香港身份首字母对应数字 */ public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>(); static { cityCodes.put("11", "北京"); cityCodes.put("12", "天津"); cityCodes.put("13", "河北"); cityCodes.put("14", "山西"); cityCodes.put("15", "内蒙古"); cityCodes.put("21", "辽宁"); cityCodes.put("22", "吉林"); cityCodes.put("23", "黑龙江"); cityCodes.put("31", "上海"); cityCodes.put("32", "江苏"); cityCodes.put("33", "浙江"); cityCodes.put("34", "安徽"); cityCodes.put("35", "福建"); cityCodes.put("36", "江西"); cityCodes.put("37", "山东"); cityCodes.put("41", "河南"); cityCodes.put("42", "湖北"); cityCodes.put("43", "湖南"); cityCodes.put("44", "广东"); cityCodes.put("45", "广西"); cityCodes.put("46", "海南"); cityCodes.put("50", "重庆"); cityCodes.put("51", "四川"); cityCodes.put("52", "贵州"); cityCodes.put("53", "云南"); cityCodes.put("54", "西藏"); cityCodes.put("61", "陕西"); cityCodes.put("62", "甘肃"); cityCodes.put("63", "青海"); cityCodes.put("64", "宁夏"); cityCodes.put("65", "新疆"); cityCodes.put("71", "台湾"); cityCodes.put("81", "香港"); cityCodes.put("82", "澳门"); cityCodes.put("91", "国外"); twFirstCode.put("A", 10); twFirstCode.put("B", 11); twFirstCode.put("C", 12); twFirstCode.put("D", 13); twFirstCode.put("E", 14); twFirstCode.put("F", 15); twFirstCode.put("G", 16); twFirstCode.put("H", 17); twFirstCode.put("J", 18); twFirstCode.put("K", 19); twFirstCode.put("L", 20); twFirstCode.put("M", 21); twFirstCode.put("N", 22); twFirstCode.put("P", 23); twFirstCode.put("Q", 24); twFirstCode.put("R", 25); twFirstCode.put("S", 26); twFirstCode.put("T", 27); twFirstCode.put("U", 28); twFirstCode.put("V", 29); twFirstCode.put("X", 30); twFirstCode.put("Y", 31); twFirstCode.put("W", 32); twFirstCode.put("Z", 33); twFirstCode.put("I", 34); twFirstCode.put("O", 35); hkFirstCode.put("A", 1); hkFirstCode.put("B", 2); hkFirstCode.put("C", 3); hkFirstCode.put("R", 18); hkFirstCode.put("U", 21); hkFirstCode.put("Z", 26); hkFirstCode.put("X", 24); hkFirstCode.put("W", 23); hkFirstCode.put("O", 15); hkFirstCode.put("N", 14); } / * 将15位身份证号码转换为18位 @param idCard * 15位身份编码 * @return 18位身份编码* / public static String conver15CardTo18(String idCard) { String idCard18 = ""; if (idCard.length() != CHINA_ID_MIN_LENGTH) { return null; } if (isNum(idCard)) { // 获取出生年月日 String birthday = idCard.substring(6, 12); Date birthDate = null; try { birthDate = new SimpleDateFormat("yyMMdd").parse(birthday); } catch (ParseException e) { e.printStackTrace(); } Calendar cal = Calendar.getInstance(); if (birthDate != null) cal.setTime(birthDate); // 获取出生年(完全表现形式,如:2010) String sYear = String.valueOf(cal.get(Calendar.YEAR)); idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8); // 转换字符数组 char[] cArr = idCard18.toCharArray(); if (cArr != null) { int[] iCard = converCharToInt(cArr); int iSum17 = getPowerSum(iCard); // 获取校验位 String sVal = getCheckCode18(iSum17); if (sVal.length() > 0) { idCard18 += sVal; } else { return null; } } } else { return null; } return idCard18; } / * 验证身份证是否合法 */ public static boolean validateCard(String idCard) { String card = idCard.trim(); if (validateIdCard18(card)) { return true; } if (validateIdCard15(card)) { return true; } String[] cardval = validateIdCard10(card); if (cardval != null) { if (cardval[2].equals("true")) { return true; } } return false; } / * 验证18位身份编码是否合法 @param idCard 身份编码 * @return 是否合法* / public static boolean validateIdCard18(String idCard) { boolean bTrue = false; if (idCard.length() == CHINA_ID_MAX_LENGTH) { // 前17位 String code17 = idCard.substring(0, 17); // 第18位 String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH); if (isNum(code17)) { char[] cArr = code17.toCharArray(); if (cArr != null) { int[] iCard = converCharToInt(cArr); int iSum17 = getPowerSum(iCard); // 获取校验位 String val = getCheckCode18(iSum17); if (val.length() > 0) { if (val.equalsIgnoreCase(code18)) { bTrue = true; } } } } } return bTrue; } / * 验证15位身份编码是否合法 @param idCard * 身份编码 * @return 是否合法
/ public static boolean validateIdCard15(String idCard) { if (idCard.length() != CHINA_ID_MIN_LENGTH) { return false; } if (isNum(idCard)) { String proCode = idCard.substring(0, 2); if (cityCodes.get(proCode) == null) { return false; } String birthCode = idCard.substring(6, 12); Date birthDate = null; try { birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2)); } catch (ParseException e) { e.printStackTrace(); } Calendar cal = Calendar.getInstance(); if (birthDate != null) cal.setTime(birthDate); if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)), Integer.valueOf(birthCode.substring(4, 6)))) { return false; } } else { return false; } return true; } /** 验证10位身份编码是否合法 @param idCard 身份编码 * @return 身份证信息数组 * <p> * [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false) * 若不是身份证件号码则返回null * </p> / public static String[] validateIdCard10(String idCard) { String[] info = new String[3]; String card = idCard.replaceAll("[(|)]", ""); if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { return null; } if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 台湾 info[0] = "台湾"; System.out.println("11111"); String char2 = idCard.substring(1, 2); if (char2.equals("1")) { info[1] = "M"; System.out.println("MMMMMMM"); } else if (char2.equals("2")) { info[1] = "F"; System.out.println("FFFFFFF"); } else { info[1] = "N"; info[2] = "false"; System.out.println("NNNN"); return info; } info[2] = validateTWCard(idCard) ? "true" : "false"; } else if (idCard.matches("^[1|5|7][0-9]{6}(?[0-9A-Z])?$")) { // 澳门 info[0] = "澳门"; info[1] = "N"; // TODO } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}(?[0-9A])?$")) { // 香港 info[0] = "香港"; info[1] = "N"; info[2] = validateHKCard(idCard) ? "true" : "false"; } else { return null; } return info; } / ** 验证台湾身份证号码 @param idCard * 身份证号码 * @return 验证码是否符合
/ public static boolean validateTWCard(String idCard) { String start = idCard.substring(0, 1); String mid = idCard.substring(1, 9); String end = idCard.substring(9, 10); Integer iStart = twFirstCode.get(start); Integer sum = iStart / 10 + (iStart % 10) 9; char[] chars = mid.toCharArray(); Integer iflag = 8; for (char c : chars) { sum = sum + Integer.valueOf(c + "") * iflag; iflag--; } return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false; } /* 验证香港身份证号码(存在Bug,部份特殊身份证无法检查) * <p> * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35 * 最后一位校验码为0-9的数字加上字符"A","A"代表10 * </p> * <p> * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效 * </p> @param idCard 身份证号码 * @return 验证码是否符合 / public static boolean validateHKCard(String idCard) { String card = idCard.replaceAll("[(|)]", ""); Integer sum = 0; if (card.length() == 9) { sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) 9 + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0])

/**

身份证验证

java验证身份证号码及编码规则和提取相应信息

转自 

身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T 2260-2007 中华人民共和国行政区划代码》):该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区)、市(地区,自治州,盟)、县(自治县、县级市、旗、自治旗、市辖区、林区、特区)。 
数字码码位结构从左至右的含义是: 
第一层为AB两位代码表示省、自治区、直辖市、特别行政区; 
第二层为CD两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中: 
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码; 
——21~50表示地区、自治州、盟; 
——90表示省(自治区)直辖县级行政区划汇总码。 
第三层为EF两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中: 
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码; 
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区; 
——81~99表示省(自治区)辖县级市。 

身份证合法性校验:IdcardValidator.java

  1. import java.text.ParseException;   
  2. import java.text.SimpleDateFormat;   
  3. import java.util.Calendar;   
  4. import java.util.Date;   
  5. import java.util.HashMap;   
  6. import java.util.Map;   
  7. import java.util.regex.Pattern;   
  8.   
  9. /**  
  10.  *         <p>  
  11.  *         类说明:身份证合法性校验  
  12.  *         </p>  
  13.  *         <p>  
  14.  *         --15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。  
  15.  *         --18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。  
  16.  *         </p>  
  17.  */  
  18. @SuppressWarnings({"unchecked","unused","all"})   
  19. public class IdcardValidator {   
  20.   
  21.     /**  
  22.      * 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",  
  23.      * 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",  
  24.      * 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",  
  25.      * 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",  
  26.      * 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",  
  27.      * 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}  
  28.      */  
  29.     protected String codeAndCity[][] = { { "11", "北京" }, { "12", "天津" },   
  30.             { "13", "河北" }, { "14", "山西" }, { "15", "内蒙古" }, { "21", "辽宁" },   
  31.             { "22", "吉林" }, { "23", "黑龙江" }, { "31", "上海" }, { "32", "江苏" },   
  32.             { "33", "浙江" }, { "34", "安徽" }, { "35", "福建" }, { "36", "江西" },   
  33.             { "37", "山东" }, { "41", "河南" }, { "42", "湖北" }, { "43", "湖南" },   
  34.             { "44", "广东" }, { "45", "广西" }, { "46", "海南" }, { "50", "重庆" },   
  35.             { "51", "四川" }, { "52", "贵州" }, { "53", "云南" }, { "54", "西藏" },   
  36.             { "61", "陕西" }, { "62", "甘肃" }, { "63", "青海" }, { "64", "宁夏" },   
  37.             { "65", "新疆" }, { "71", "台湾" }, { "81", "香港" }, { "82", "澳门" },   
  38.             { "91", "国外" } };   
  39.   
  40.         private String cityCode[] = { "11", "12", "13", "14", "15", "21", "22",   
  41.             "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",   
  42.             "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63",   
  43.             "64", "65", "71", "81", "82", "91" };   
  44.   
  45.     // 每位加权因子   
  46.     private int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };   
  47.   
  48.     // 第18位校检码   
  49.     private String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5",   
  50.             "4", "3", "2" };   
  51.   
  52.        
  53.     /**  
  54.      * 验证所有的身份证的合法性  
  55.      * @param idcard  
  56.      * @return  
  57.      */  
  58.     public boolean isValidatedAllIdcard(String idcard) {   
  59.         if (idcard.length() == 15) {   
  60.             idcard = this.convertIdcarBy15bit(idcard);   
  61.         }   
  62.         return this.isValidate18Idcard(idcard);   
  63.     }   
  64.   
  65.     /**  
  66.      * <p>  
  67.      * 判断18位身份证的合法性  
  68.      * </p>  
  69.      * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。  
  70.      * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。  
  71.      * <p>  
  72.      * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。  
  73.      * </p>  
  74.      * <p>  
  75.      * 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;  
  76.      * 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;  
  77.      * 6.第17位数字表示性别:奇数表示男性,偶数表示女性;  
  78.      * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。  
  79.      * </p>  
  80.      * <p>  
  81.      * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4  
  82.      * 2 1 6 3 7 9 10 5 8 4 2  
  83.      * </p>  
  84.      * <p>  
  85.      * 2.将这17位数字和系数相乘的结果相加。  
  86.      * </p>  
  87.      * <p>  
  88.      * 3.用加出来和除以11,看余数是多少?  
  89.      * </p>  
  90.      * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3  
  91.      * 2。  
  92.      * <p>  
  93.      * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。  
  94.      * </p>  
  95.      *   
  96.      * @param idcard  
  97.      * @return  
  98.      */  
  99.     public boolean isValidate18Idcard(String idcard) {   
  100.         // 非18位为假   
  101.         if (idcard.length() != 18) {   
  102.             return false;   
  103.         }   
  104.         // 获取前17位   
  105.         String idcard17 = idcard.substring(0, 17);   
  106.         // 获取第18位   
  107.         String idcard18Code = idcard.substring(17, 18);   
  108.         char c[] = null;   
  109.         String checkCode = "";   
  110.         // 是否都为数字   
  111.         if (isDigital(idcard17)) {   
  112.             c = idcard17.toCharArray();   
  113.         } else {   
  114.             return false;   
  115.         }   
  116.   
  117.         if (null != c) {   
  118.             int bit[] = new int[idcard17.length()];   
  119.   
  120.             bit = converCharToInt(c);   
  121.   
  122.             int sum17 = 0;   
  123.   
  124.             sum17 = getPowerSum(bit);   
  125.   
  126.             // 将和值与11取模得到余数进行校验码判断   
  127.             checkCode = getCheckCodeBySum(sum17);   
  128.             if (null == checkCode) {   
  129.                 return false;   
  130.             }   
  131.             // 将身份证的第18位与算出来的校码进行匹配,不相等就为假   
  132.             if (!idcard18Code.equalsIgnoreCase(checkCode)) {   
  133.                 return false;   
  134.             }   
  135.         }   
  136.         return true;   
  137.     }   
  138.   
  139.     /**  
  140.      * 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。  
  141.      *   
  142.      * @param idcard  
  143.      * @return  
  144.      */  
  145.     public boolean isValidate15Idcard(String idcard) {   
  146.         // 非15位为假   
  147.         if (idcard.length() != 15) {   
  148.             return false;   
  149.         }   
  150.   
  151.         // 是否全都为数字   
  152.         if (isDigital(idcard)) {   
  153.             String provinceid = idcard.substring(0, 2);   
  154.             String birthday = idcard.substring(6, 12);   
  155.             int year = Integer.parseInt(idcard.substring(6, 8));   
  156.             int month = Integer.parseInt(idcard.substring(8, 10));   
  157.             int day = Integer.parseInt(idcard.substring(10, 12));   
  158.   
  159.             // 判断是否为合法的省份   
  160.             boolean flag = false;   
  161.             for (String id : cityCode) {   
  162.                 if (id.equals(provinceid)) {   
  163.                     flag = true;   
  164.                     break;   
  165.                 }   
  166.             }   
  167.             if (!flag) {   
  168.                 return false;   
  169.             }   
  170.             // 该身份证生出日期在当前日期之后时为假   
  171.             Date birthdate = null;   
  172.             try {   
  173.                 birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);   
  174.             } catch (ParseException e) {   
  175.                 e.printStackTrace();   
  176.             }   
  177.             if (birthdate == null || new Date().before(birthdate)) {   
  178.                 return false;   
  179.             }   
  180.   
  181.             // 判断是否为合法的年份   
  182.             GregorianCalendar curDay = new GregorianCalendar();   
  183.             int curYear = curDay.get(Calendar.YEAR);   
  184.             int year2bit = Integer.parseInt(String.valueOf(curYear)   
  185.                     .substring(2));   
  186.   
  187.             // 判断该年份的两位表示法,小于50的和大于当前年份的,为假   
  188.             if ((year < 50 && year > year2bit)) {   
  189.                 return false;   
  190.             }   
  191.   
  192.             // 判断是否为合法的月份   
  193.             if (month < 1 || month > 12) {   
  194.                 return false;   
  195.             }   
  196.   
  197.             // 判断是否为合法的日期   
  198.             boolean mflag = false;   
  199.             curDay.setTime(birthdate);  //将该身份证的出生日期赋于对象curDay   
  200.             switch (month) {   
  201.             case 1:   
  202.             case 3:   
  203.             case 5:   
  204.             case 7:   
  205.             case 8:   
  206.             case 10:   
  207.             case 12:   
  208.                 mflag = (day >= 1 && day <= 31);   
  209.                 break;   
  210.             case 2: //公历的2月非闰年有28天,闰年的2月是29天。   
  211.                 if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) {   
  212.                     mflag = (day >= 1 && day <= 29);   
  213.                 } else {   
  214.                     mflag = (day >= 1 && day <= 28);   
  215.                 }   
  216.                 break;   
  217.             case 4:   
  218.             case 6:   
  219.             case 9:   
  220.             case 11:   
  221.                 mflag = (day >= 1 && day <= 30);   
  222.                 break;   
  223.             }   
  224.             if (!mflag) {   
  225.                 return false;   
  226.             }   
  227.         } else {   
  228.             return false;   
  229.         }   
  230.         return true;   
  231.     }   
  232.   
  233.     /**  
  234.      * 将15位的身份证转成18位身份证  
  235.      *   
  236.      * @param idcard  
  237.      * @return  
  238.      */  
  239.     public String convertIdcarBy15bit(String idcard) {   
  240.         String idcard17 = null;   
  241.         // 非15位身份证   
  242.         if (idcard.length() != 15) {   
  243.             return null;   
  244.         }   
  245.   
  246.         if (isDigital(idcard)) {   
  247.             // 获取出生年月日   
  248.             String birthday = idcard.substring(6, 12);   
  249.             Date birthdate = null;   
  250.             try {   
  251.                 birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);   
  252.             } catch (ParseException e) {   
  253.                 e.printStackTrace();   
  254.             }   
  255.             Calendar cday = Calendar.getInstance();   
  256.             cday.setTime(birthdate);   
  257.             String year = String.valueOf(cday.get(Calendar.YEAR));   
  258.   
  259.             idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);   
  260.   
  261.             char c[] = idcard17.toCharArray();   
  262.             String checkCode = "";   
  263.   
  264.             if (null != c) {   
  265.                 int bit[] = new int[idcard17.length()];   
  266.   
  267.                 // 将字符数组转为整型数组   
  268.                 bit = converCharToInt(c);   
  269.                 int sum17 = 0;   
  270.                 sum17 = getPowerSum(bit);   
  271.   
  272.                 // 获取和值与11取模得到余数进行校验码   
  273.                 checkCode = getCheckCodeBySum(sum17);   
  274.                 // 获取不到校验位   
  275.                 if (null == checkCode) {   
  276.                     return null;   
  277.                 }   
  278.   
  279.                 // 将前17位与第18位校验码拼接   
  280.                 idcard17 += checkCode;   
  281.             }   
  282.         } else { // 身份证包含数字   
  283.             return null;   
  284.         }   
  285.         return idcard17;   
  286.     }   
  287.   
  288.     /**  
  289.      * 15位和18位身份证号码的基本数字和位数验校  
  290.      *   
  291.      * @param idcard  
  292.      * @return  
  293.      */  
  294.     public boolean isIdcard(String idcard) {   
  295.         return idcard == null || "".equals(idcard) ? false : Pattern.matches(   
  296.                 "(^\d{15}$)|(\d{17}(?:\d|x|X)$)", idcard);   
  297.     }   
  298.   
  299.     /**  
  300.      * 15位身份证号码的基本数字和位数验校  
  301.      *   
  302.      * @param idcard  
  303.      * @return  
  304.      */  
  305.     public boolean is15Idcard(String idcard) {   
  306.         return idcard == null || "".equals(idcard) ? false : Pattern.matches(   
  307.                 "^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$",   
  308.                 idcard);   
  309.     }   
  310.   
  311.     /**  
  312.      * 18位身份证号码的基本数字和位数验校  
  313.      *   
  314.      * @param idcard  
  315.      * @return  
  316.      */  
  317.     public boolean is18Idcard(String idcard) {   
  318.         return Pattern   
  319.                 .matches(   
  320.                         "^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([\d|x|X]{1})$",   
  321.                         idcard);   
  322.     }   
  323.   
  324.     /**  
  325.      * 数字验证  
  326.      *   
  327.      * @param str  
  328.      * @return  
  329.      */  
  330.     public boolean isDigital(String str) {   
  331.         return str == null || "".equals(str) ? false : str.matches("^[0-9]*$");   
  332.     }   
  333.   
  334.     /**  
  335.      * 将身份证的每位和对应位的加权因子相乘之后,再得到和值  
  336.      *   
  337.      * @param bit  
  338.      * @return  
  339.      */  
  340.     public int getPowerSum(int[] bit) {   
  341.   
  342.         int sum = 0;   
  343.   
  344.         if (power.length != bit.length) {   
  345.             return sum;   
  346.         }   
  347.   
  348.         for (int i = 0; i < bit.length; i++) {   
  349.             for (int j = 0; j < power.length; j++) {   
  350.                 if (i == j) {   
  351.                     sum = sum + bit[i] * power[j];   
  352.                 }   
  353.             }   
  354.         }   
  355.         return sum;   
  356.     }   
  357.   
  358.     /**  
  359.      * 将和值与11取模得到余数进行校验码判断  
  360.      *   
  361.      * @param checkCode  
  362.      * @param sum17  
  363.      * @return 校验位  
  364.      */  
  365.     public String getCheckCodeBySum(int sum17) {   
  366.         String checkCode = null;   
  367.         switch (sum17 % 11) {   
  368.         case 10:   
  369.             checkCode = "2";   
  370.             break;   
  371.         case 9:   
  372.             checkCode = "3";   
  373.             break;   
  374.         case 8:   
  375.             checkCode = "4";   
  376.             break;   
  377.         case 7:   
  378.             checkCode = "5";   
  379.             break;   
  380.         case 6:   
  381.             checkCode = "6";   
  382.             break;   
  383.         case 5:   
  384.             checkCode = "7";   
  385.             break;   
  386.         case 4:   
  387.             checkCode = "8";   
  388.             break;   
  389.         case 3:   
  390.             checkCode = "9";   
  391.             break;   
  392.         case 2:   
  393.             checkCode = "x";   
  394.             break;   
  395.         case 1:   
  396.             checkCode = "0";   
  397.             break;   
  398.         case 0:   
  399.             checkCode = "1";   
  400.             break;   
  401.         }   
  402.         return checkCode;   
  403.     }   
  404.   
  405.     /**  
  406.      * 将字符数组转为整型数组  
  407.      *   
  408.      * @param c  
  409.      * @return  
  410.      * @throws NumberFormatException  
  411.      */  
  412.     public int[] converCharToInt(char[] c) throws NumberFormatException {   
  413.         int[] a = new int[c.length];   
  414.         int k = 0;   
  415.         for (char temp : c) {   
  416.             a[k++] = Integer.parseInt(String.valueOf(temp));   
  417.         }   
  418.         return a;   
  419.     }   
  420.   
  421.     public static void main(String[] args) throws Exception {   
  422.                   String idcard15 = "";   
  423.                   String idcard18 = "";   
  424.         IdcardValidator iv = new IdcardValidator();   
  425.         boolean flag = false;   
  426.         flag = iv.isValidate18Idcard(idcard18);   
  427.         System.out.println(flag);   
  428.   
  429.         flag = iv.isValidate15Idcard(idcard15);   
  430.         System.out.println(flag);   
  431.   
  432.         System.out.println(iv.convertIdcarBy15bit(idcard15));   
  433.         flag = iv.isValidate18Idcard(iv.convertIdcarBy15bit(idcard15));   
  434.         System.out.println(flag);   
  435.   
  436.         System.out.println(iv.isValidatedAllIdcard(idcard18));   
  437.            
  438.         }   
  439. }  

提取身份证相关信息:IdcardInfoExtractor.java

  1. import java.text.SimpleDateFormat;   
  2. import java.util.Calendar;   
  3. import java.util.Date;   
  4. import java.util.GregorianCalendar;   
  5. import java.util.HashMap;   
  6. import java.util.Map;   
  7. import java.util.Set;   
  8.   
  9. /**  
  10.  *         <p>  
  11.  *         类说明:提取身份证相关信息  
  12.  *         </p>  
  13.  */  
  14. public class IdcardInfoExtractor {   
  15.     // 省份   
  16.     private String province;   
  17.     // 城市   
  18.     private String city;   
  19.     // 区县   
  20.     private String region;   
  21.     // 年份   
  22.     private int year;   
  23.     // 月份   
  24.     private int month;   
  25.     // 日期   
  26.     private int day;   
  27.     // 性别   
  28.     private String gender;   
  29.     // 出生日期   
  30.     private Date birthday;   
  31.   
  32.     private Map<String, String> cityCodeMap = new HashMap<String, String>() {   
  33.         {   
  34.             this.put("11", "北京");   
  35.             this.put("12", "天津");   
  36.             this.put("13", "河北");   
  37.             this.put("14", "山西");   
  38.             this.put("15", "内蒙古");   
  39.             this.put("21", "辽宁");   
  40.             this.put("22", "吉林");   
  41.             this.put("23", "黑龙江");   
  42.             this.put("31", "上海");   
  43.             this.put("32", "江苏");   
  44.             this.put("33", "浙江");   
  45.             this.put("34", "安徽");   
  46.             this.put("35", "福建");   
  47.             this.put("36", "江西");   
  48.             this.put("37", "山东");   
  49.             this.put("41", "河南");   
  50.             this.put("42", "湖北");   
  51.             this.put("43", "湖南");   
  52.             this.put("44", "广东");   
  53.             this.put("45", "广西");   
  54.             this.put("46", "海南");   
  55.             this.put("50", "重庆");   
  56.             this.put("51", "四川");   
  57.             this.put("52", "贵州");   
  58.             this.put("53", "云南");   
  59.             this.put("54", "西藏");   
  60.             this.put("61", "陕西");   
  61.             this.put("62", "甘肃");   
  62.             this.put("63", "青海");   
  63.             this.put("64", "宁夏");   
  64.             this.put("65", "新疆");   
  65.             this.put("71", "台湾");   
  66.             this.put("81", "香港");   
  67.             this.put("82", "澳门");   
  68.             this.put("91", "国外");   
  69.         }   
  70.     };   
  71.        
  72.     private IdcardValidator validator = null;   
  73.        
  74.     /**  
  75.      * 通过构造方法初始化各个成员属性  
  76.      */  
  77.     public IdcardInfoExtractor(String idcard) {   
  78.         try {   
  79.             validator = new IdcardValidator();   
  80.             if (validator.isValidatedAllIdcard(idcard)) {   
  81.                 if (idcard.length() == 15) {   
  82.                     idcard = validator.convertIdcarBy15bit(idcard);   
  83.                 }   
  84.                 // 获取省份   
  85.                 String provinceId = idcard.substring(0, 2);   
  86.                 Set<String> key = this.cityCodeMap.keySet();   
  87.                 for (String id : key) {   
  88.                     if (id.equals(provinceId)) {   
  89.                         this.province = this.cityCodeMap.get(id);   
  90.                         break;   
  91.                     }   
  92.                 }   
  93.   
  94.                 // 获取性别   
  95.                 String id17 = idcard.substring(16, 17);   
  96.                 if (Integer.parseInt(id17) % 2 != 0) {   
  97.                     this.gender = "男";   
  98.                 } else {   
  99.                     this.gender = "女";   
  100.                 }   
  101.   
  102.                 // 获取出生日期   
  103.                 String birthday = idcard.substring(6, 14);   
  104.                 Date birthdate = new SimpleDateFormat("yyyyMMdd")   
  105.                         .parse(birthday);   
  106.                 this.birthday = birthdate;   
  107.                 GregorianCalendar currentDay = new GregorianCalendar();   
  108.                 currentDay.setTime(birthdate);   
  109.                 this.year = currentDay.get(Calendar.YEAR);   
  110.                 this.month = currentDay.get(Calendar.MONTH) + 1;   
  111.                 this.day = currentDay.get(Calendar.DAY_OF_MONTH);   
  112.             }   
  113.         } catch (Exception e) {   
  114.             e.printStackTrace();   
  115.         }   
  116.     }   
  117.   
  118.     /**  
  119.      * @return the province  
  120.      */  
  121.     public String getProvince() {   
  122.         return province;   
  123.     }   
  124.   
  125.     /**  
  126.      * @return the city  
  127.      */  
  128.     public String getCity() {   
  129.         return city;   
  130.     }   
  131.   
  132.     /**  
  133.      * @return the region  
  134.      */  
  135.     public String getRegion() {   
  136.         return region;   
  137.     }   
  138.   
  139.     /**  
  140.      * @return the year  
  141.      */  
  142.     public int getYear() {   
  143.         return year;   
  144.     }   
  145.   
  146.     /**  
  147.      * @return the month  
  148.      */  
  149.     public int getMonth() {   
  150.         return month;   
  151.     }   
  152.   
  153.     /**  
  154.      * @return the day  
  155.      */  
  156.     public int getDay() {   
  157.         return day;   
  158.     }   
  159.   
  160.     /**  
  161.      * @return the gender  
  162.      */  
  163.     public String getGender() {   
  164.         return gender;   
  165.     }   
  166.   
  167.     /**  
  168.      * @return the birthday  
  169.      */  
  170.     public Date getBirthday() {   
  171.         return birthday;   
  172.     }   
  173.   
  174.     @Override  
  175.     public String toString() {   
  176.         return "省份:" + this.province + ",性别:" + this.gender + ",出生日期:"  
  177.                 + this.birthday;   
  178.     }   
  179.   
  180.     public static void main(String[] args) {   
  181.         String idcard = "";   
  182.         IdcardInfoExtractor ie = new IdcardInfoExtractor(idcard);   
  183.         System.out.println(ie.toString());   
  184.     }   
  185. }  

参考文章: 
 
 

  • 55) * 8; card = card.substring(1, 9); } else { sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0])
  • 55) * 8; } String mid = card.substring(1, 7); String end = card.substring(7, 8); char[] chars = mid.toCharArray(); Integer iflag = 7; for (char c : chars) { sum = sum + Integer.valueOf(c + "") * iflag; iflag--; } if (end.toUpperCase().equals("A")) { sum = sum + 10; } else { sum = sum + Integer.valueOf(end); } return (sum % 11 == 0) ? true : false; } / * 将字符数组转换成数字数组 @param ca * 字符数组 * @return 数字数组
    */ public static int[] converCharToInt(char[] ca) { int len = ca.length; int[] iArr = new int[len]; try { for (int i = 0; i < len; i++) { iArr[i] = Integer.parseInt(String.valueOf(ca[i])); } } catch (NumberFormatException e) { e.printStackTrace(); } return iArr; } /
    * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 @param iArr * @return 身份证编码。 / public static int getPowerSum(int[] iArr) { int iSum = 0; if (power.length == iArr.length) { for (int i = 0; i < iArr.length; i++) { for (int j = 0; j < power.length; j++) { if (i == j) { iSum = iSum + iArr[i] power[j]; } } } } return iSum; } / * 将power和值与11取模获得余数进行校验码判断 @param iSum * @return 校验位
    */ public static String getCheckCode18(int iSum) { String sCode = ""; switch (iSum % 11) { case 10: sCode = "2"; break; case 9: sCode = "3"; break; case 8: sCode = "4"; break; case 7: sCode = "5"; break; case 6: sCode = "6"; break; case 5: sCode = "7"; break; case 4: sCode = "8"; break; case 3: sCode = "9"; break; case 2: sCode = "x"; break; case 1: sCode = "0"; break; case 0: sCode = "1"; break; } return sCode; } /
    * 根据身份编号获取年龄 @param idCard * 身份编号 * @return 年龄 / public static int getAgeByIdCard(String idCard) { int iAge = 0; if (idCard.length() == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } String year = idCard.substring(6, 10); Calendar cal = Calendar.getInstance(); int iCurrYear = cal.get(Calendar.YEAR); iAge = iCurrYear - Integer.valueOf(year); return iAge; } / ** 根据身份编号获取生日 @param idCard 身份编号 * @return 生日(yyyyMMdd)
    / public static String getBirthByIdCard(String idCard) { Integer len = idCard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; } else if (len == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } return idCard.substring(6, 14); } /** 根据身份编号获取生日年 @param idCard 身份编号 * @return 生日(yyyy) / public static Short getYearByIdCard(String idCard) { Integer len = idCard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; } else if (len == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } return Short.valueOf(idCard.substring(6, 10)); } / ** 根据身份编号获取生日月 @param idCard * 身份编号 * @return 生日(MM)
    / public static Short getMonthByIdCard(String idCard) { Integer len = idCard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; } else if (len == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } return Short.valueOf(idCard.substring(10, 12)); } /** 根据身份编号获取生日天 @param idCard * 身份编号 * @return 生日(dd) / public static Short getDateByIdCard(String idCard) { Integer len = idCard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; } else if (len == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } return Short.valueOf(idCard.substring(12, 14)); } / ** 根据身份编号获取性别 @param idCard 身份编号 * @return 性别(M-男,F-女,N-未知)
    / public static String getGenderByIdCard(String idCard) { String sGender = "N"; if (idCard.length() == CHINA_ID_MIN_LENGTH) { idCard = conver15CardTo18(idCard); } String sCardNum = idCard.substring(16, 17); if (Integer.parseInt(sCardNum) % 2 != 0) { sGender = "M"; } else { sGender = "F"; } return sGender; } /** 根据身份编号获取户籍省份 @param idCard 身份编码 * @return 省级编码。 / public static String getProvinceByIdCard(String idCard) { int len = idCard.length(); String sProvince = null; String sProvinNum = ""; if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { sProvinNum = idCard.substring(0, 2); } sProvince = cityCodes.get(sProvinNum); return sProvince; } / ** 数字验证 @param val * @return 提取的数字。
    / public static boolean isNum(String val) { return val == null || "".equals(val) ? false : val.matches("^[0-9]$"); } /* 验证小于当前日期 是否有效 @param iYear * 待验证日期(年) * @param iMonth * 待验证日期(月 1-12) * @param iDate * 待验证日期(日) * @return 是否有效* / public static boolean valiDate(int iYear, int iMonth, int iDate) { Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int datePerMonth; if (iYear < MIN || iYear >= year) { return false; } if (iMonth < 1 || iMonth > 12) { return false; } switch (iMonth) { case 4: case 6: case 9: case 11: datePerMonth = 30; break; case 2: boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0)) && (iYear > MIN && iYear < year); datePerMonth = dm ? 29 : 28; break; default: datePerMonth = 31; } return (iDate >= 1) && (iDate <= datePerMonth); } }

 * Copyright (C) 2009-2010 Yichuan, Fuchun All rights reserved.

Java代码 

```

 * Licensed to the Apache Software Foundation (ASF) under one or more

import java.text.ParseException;    

 * contributor license agreements. See the NOTICE file distributed with

import java.text.SimpleDateFormat;    

 * this work for additional information regarding copyright ownership.

import java.util.Calendar;    

 * The ASF licenses this file to You under the Apache License, Version 2.0

import java.util.Date;    

 * (the "License"); you may not use this file except in compliance with

//身份证校验  

 * the License. You may obtain a copy of the License at

//参考:  

 *

/** 

 * Unless required by applicable law or agreed to in writing, software

 * 身份证合法性校验 

 * distributed under the License is distributed on an "AS IS" BASIS,

 * --15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。 

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * --18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。 

 * See the License for the specific language governing permissions and

 * --最后一位为校验位 

 * limitations under the License.

 */    

 * @(#) IdcardUtils.java Date: 2010-06-17

public class IdcardValidator {    

 */

/** 

package my.tools;

     * 省、直辖市代码表: 

import java.text.ParseException;

     *     11 : 北京  12 : 天津  13 : 河北       14 : 山西  15 : 内蒙古   

import java.text.SimpleDateFormat;

     *     21 : 辽宁  22 : 吉林  23 : 黑龙江  31 : 上海  32 : 江苏   

import java.util.Calendar;

     *     33 : 浙江  34 : 安徽  35 : 福建       36 : 江西  37 : 山东   

import java.util.Date;

     *     41 : 河南  42 : 湖北  43 : 湖南       44 : 广东  45 : 广西      46 : 海南   

import java.util.HashMap;

     *     50 : 重庆  51 : 四川  52 : 贵州       53 : 云南  54 : 西藏   

import java.util.Map;

     *     61 : 陕西  62 : 甘肃  63 : 青海       64 : 宁夏  65 : 新疆   

import org.apache.commons.lang.StringUtils;

     *     71 : 台湾   

/**

     *     81 : 香港  82 : 澳门   

 * 身份证工具类

     *     91 : 国外 

 *

     */    

 * @author June

private static String cityCode[] = { "11", "12", "13", "14", "15", "21",    

 * @version 1.0, 2010-06-17

"22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42",    

 */

"43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62",    

public class IdcardUtils extends StringUtils {

"63", "64", "65", "71", "81", "82", "91" };    

    /** 中国公民身份证号码最小长度。 */

/** 

    public static final int CHINA_ID_MIN_LENGTH = 15;

     * 每位加权因子 

    /** 中国公民身份证号码最大长度。 */

     */    

    public static final int CHINA_ID_MAX_LENGTH = 18;

private static int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };    

    /** 省、直辖市代码表 */

/** 

    public static final String cityCode[] = {

     * 验证所有的身份证的合法性 

            "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",

     * @param idcard 身份证 

            "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71",

     * @return 合法返回true,否则返回false 

            "81", "82", "91"

     */    

    };

public static boolean isValidatedAllIdcard(String idcard) {    

    /** 每位加权因子 */

if (idcard == null || "".equals(idcard)) {    

    public static final int power[] = {

return false;    

            7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2

        }    

    };

if (idcard.length() == 15) {    

    /** 第18位校检码 */

return validate15IDCard(idcard);    

    public static final String verifyCode[] = {

        }    

            "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"

return validate18Idcard(idcard);    

    };

    }    

    /** 最低年限 */

/** 

    public static final int MIN = 1930;

     *  

    public static Map<String, String> cityCodes = new HashMap<String, String>();

     * 判断18位身份证的合法性 

    /** 台湾身份首字母对应数字 */

     *  

    public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();

     * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 

    /** 香港身份首字母对应数字 */

     * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 

    public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();

     *  

    static {

     * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 

        cityCodes.put("11", "北京");

     *  

        cityCodes.put("12", "天津");

     * 1.前1、2位数字表示:所在省份的代码; 

        cityCodes.put("13", "河北");

     * 2.第3、4位数字表示:所在城市的代码; 

        cityCodes.put("14", "山西");

     * 3.第5、6位数字表示:所在区县的代码; 

        cityCodes.put("15", "内蒙古");

     * 4.第7~14位数字表示:出生年、月、日; 

        cityCodes.put("21", "辽宁");

     * 5.第15、16位数字表示:所在地的派出所的代码; 

        cityCodes.put("22", "吉林");

     * 6.第17位数字表示性别:奇数表示男性,偶数表示女性; 

        cityCodes.put("23", "黑龙江");

     * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 

        cityCodes.put("31", "上海");

     *  

        cityCodes.put("32", "江苏");

     * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 

        cityCodes.put("33", "浙江");

     *  

        cityCodes.put("34", "安徽");

     * 2.将这17位数字和系数相乘的结果相加。 

        cityCodes.put("35", "福建");

     *  

        cityCodes.put("36", "江西");

     * 3.用加出来和除以11,看余数是多少 

        cityCodes.put("37", "山东");

     *  

        cityCodes.put("41", "河南");

     * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 

        cityCodes.put("42", "湖北");

     * 2。 

        cityCodes.put("43", "湖南");

     *  

        cityCodes.put("44", "广东");

     * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 

        cityCodes.put("45", "广西");

     *  

        cityCodes.put("46", "海南");

     *  

        cityCodes.put("50", "重庆");

     * @param idcard 

        cityCodes.put("51", "四川");

     * @return 

        cityCodes.put("52", "贵州");

     */    

        cityCodes.put("53", "云南");

public static boolean validate18Idcard(String idcard) {    

        cityCodes.put("54", "西藏");

if (idcard == null) {    

        cityCodes.put("61", "陕西");

return false;    

        cityCodes.put("62", "甘肃");

        }    

        cityCodes.put("63", "青海");

// 非18位为假    

        cityCodes.put("64", "宁夏");

if (idcard.length() != 18) {    

        cityCodes.put("65", "新疆");

return false;    

        cityCodes.put("71", "台湾");

        }    

        cityCodes.put("81", "香港");

// 获取前17位    

        cityCodes.put("82", "澳门");

String idcard17 = idcard.substring(0, 17);    

        cityCodes.put("91", "国外");

// 前17位全部为数字    

        twFirstCode.put("A", 10);

if (!isDigital(idcard17)) {    

        twFirstCode.put("B", 11);

return false;    

        twFirstCode.put("C", 12);

        }    

        twFirstCode.put("D", 13);

String provinceid = idcard.substring(0, 2);    

        twFirstCode.put("E", 14);

// 校验省份    

        twFirstCode.put("F", 15);

if (!checkProvinceid(provinceid)) {    

        twFirstCode.put("G", 16);

return false;    

        twFirstCode.put("H", 17);

        }    

        twFirstCode.put("J", 18);

// 校验出生日期    

        twFirstCode.put("K", 19);

String birthday = idcard.substring(6, 14);    

        twFirstCode.put("L", 20);

SimpleDateFormat sdf =new SimpleDateFormat("yyyyMMdd");    

        twFirstCode.put("M", 21);

try {    

        twFirstCode.put("N", 22);

            Date birthDate = sdf.parse(birthday);    

        twFirstCode.put("P", 23);

            String tmpDate = sdf.format(birthDate);    

        twFirstCode.put("Q", 24);

if (!tmpDate.equals(birthday)) {// 出生年月日不正确    

        twFirstCode.put("R", 25);

return false;    

        twFirstCode.put("S", 26);

            }    

        twFirstCode.put("T", 27);

}catch (ParseException e1) {    

        twFirstCode.put("U", 28);

return false;    

        twFirstCode.put("V", 29);

        }    

        twFirstCode.put("X", 30);

// 获取第18位    

        twFirstCode.put("Y", 31);

String idcard18Code = idcard.substring(17, 18);    

        twFirstCode.put("W", 32);

char c[] = idcard17.toCharArray();    

        twFirstCode.put("Z", 33);

int bit[] = converCharToInt(c);    

        twFirstCode.put("I", 34);

int sum17 = 0;    

        twFirstCode.put("O", 35);

        sum17 = getPowerSum(bit);    

        hkFirstCode.put("A", 1);

// 将和值与11取模得到余数进行校验码判断    

        hkFirstCode.put("B", 2);

        String checkCode = getCheckCodeBySum(sum17);    

        hkFirstCode.put("C", 3);

if (null == checkCode) {    

        hkFirstCode.put("R", 18);

return false;    

        hkFirstCode.put("U", 21);

        }    

        hkFirstCode.put("Z", 26);

// 将身份证的第18位与算出来的校码进行匹配,不相等就为假    

        hkFirstCode.put("X", 24);

if (!idcard18Code.equalsIgnoreCase(checkCode)) {    

        hkFirstCode.put("W", 23);

return false;    

        hkFirstCode.put("O", 15);

        }    

        hkFirstCode.put("N", 14);

return true;    

    }

    }    

    /**

/** 

     * 将15位身份证号码转换为18位

     * 校验15位身份证 

     *

     *  

     * @param idCard

     * 

     *            15位身份编码

 

     * @return 18位身份编码

     * 只校验省份和出生年月日 

     */

     *  

    public static String conver15CardTo18(String idCard) {

     *  

        String idCard18 = "";

     * @param idcard 

        if (idCard.length() != CHINA_ID_MIN_LENGTH) {

     * @return 

            return null;

     */    

        }

public static boolean validate15IDCard(String idcard) {    

        if (isNum(idCard)) {

if (idcard == null) {    

            // 获取出生年月日

return false;    

            String birthday = idCard.substring(6, 12);

        }    

            Date birthDate = null;

// 非15位为假    

            try {

if (idcard.length() != 15) {    

                birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);

return false;    

            } catch (ParseException e) {

        }    

                e.printStackTrace();

// 15全部为数字    

            }

if (!isDigital(idcard)) {    

            Calendar cal = Calendar.getInstance();

return false;    

            if (birthDate != null)

        }    

                cal.setTime(birthDate);

String provinceid = idcard.substring(0, 2);    

            // 获取出生年(完全表现形式,如:2010)

// 校验省份    

            String sYear = String.valueOf(cal.get(Calendar.YEAR));

if (!checkProvinceid(provinceid)) {    

            idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);

return false;    

            // 转换字符数组

        }    

            char[] cArr = idCard18.toCharArray();

String birthday = idcard.substring(6, 12);    

            if (cArr != null) {

SimpleDateFormat sdf =new SimpleDateFormat("yyMMdd");    

                int[] iCard = converCharToInt(cArr);

try {    

                int iSum17 = getPowerSum(iCard);

            Date birthDate = sdf.parse(birthday);    

                // 获取校验位

            String tmpDate = sdf.format(birthDate);    

                String sVal = getCheckCode18(iSum17);

if (!tmpDate.equals(birthday)) {// 身份证日期错误    

                if (sVal.length() > 0) {

return false;    

                    idCard18 += sVal;

            }    

                } else {

}catch (ParseException e1) {    

                    return null;

return false;    

                }

        }    

            }

return true;    

        } else {

    }    

            return null;

/** 

        }

     * 将15位的身份证转成18位身份证 

        return idCard18;

     *  

    }

     * @param idcard 

    /**

     * @return 

     * 验证身份证是否合法

     */    

     */

public static String convertIdcarBy15bit(String idcard) {    

    public static boolean validateCard(String idCard) {

if (idcard == null) {    

        String card = idCard.trim();

return null;    

        if (validateIdCard18(card)) {

        }    

            return true;

// 非15位身份证    

        }

if (idcard.length() != 15) {    

        if (validateIdCard15(card)) {

return null;    

            return true;

        }    

        }

// 15全部为数字    

        String[] cardval = validateIdCard10(card);

if (!isDigital(idcard)) {    

        if (cardval != null) {

return null;    

            if (cardval[2].equals("true")) {

        }    

                return true;

String provinceid = idcard.substring(0, 2);    

            }

// 校验省份    

        }

if (!checkProvinceid(provinceid)) {    

        return false;

return null;    

    }

        }    

    /**

String birthday = idcard.substring(6, 12);    

     * 验证18位身份编码是否合法

SimpleDateFormat sdf =new SimpleDateFormat("yyMMdd");    

     *

Date birthdate =null;    

     * @param idCard 身份编码

try {    

     * @return 是否合法

            birthdate = sdf.parse(birthday);    

     */

            String tmpDate = sdf.format(birthdate);    

    public static boolean validateIdCard18(String idCard) {

if (!tmpDate.equals(birthday)) {// 身份证日期错误    

        boolean bTrue = false;

return null;    

        if (idCard.length() == CHINA_ID_MAX_LENGTH) {

            }    

            // 前17位

}catch (ParseException e1) {    

            String code17 = idCard.substring(0, 17);

return null;    

            // 第18位

        }    

            String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);

        Calendar cday = Calendar.getInstance();    

            if (isNum(code17)) {

        cday.setTime(birthdate);    

                char[] cArr = code17.toCharArray();

        String year = String.valueOf(cday.get(Calendar.YEAR));    

                if (cArr != null) {

String idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);    

                    int[] iCard = converCharToInt(cArr);

char c[] = idcard17.toCharArray();    

                    int iSum17 = getPowerSum(iCard);

String checkCode ="";    

                    // 获取校验位

// 将字符数组转为整型数组    

                    String val = getCheckCode18(iSum17);

int bit[] = converCharToInt(c);    

                    if (val.length() > 0) {

int sum17 = 0;    

                        if (val.equalsIgnoreCase(code18)) {

        sum17 = getPowerSum(bit);    

                            bTrue = true;

// 获取和值与11取模得到余数进行校验码    

                        }

        checkCode = getCheckCodeBySum(sum17);    

                    }

// 获取不到校验位    

                }

if (null == checkCode) {    

            }

return null;    

        }

        }    

        return bTrue;

// 将前17位与第18位校验码拼接    

    }

        idcard17 += checkCode;    

    /**

return idcard17;    

     * 验证15位身份编码是否合法

    }    

     *

/** 

     * @param idCard

     * 校验省份 

     *            身份编码

     *  

     * @return 是否合法

     * @param provinceid 

     */

     * @return 合法返回TRUE,否则返回FALSE 

    public static boolean validateIdCard15(String idCard) {

     */    

        if (idCard.length() != CHINA_ID_MIN_LENGTH) {

private static boolean checkProvinceid(String provinceid) {    

            return false;

for (String id : cityCode) {    

        }

if (id.equals(provinceid)) {    

        if (isNum(idCard)) {

return true;    

            String proCode = idCard.substring(0, 2);

            }    

            if (cityCodes.get(proCode) == null) {

        }    

                return false;

return false;    

            }

    }    

            String birthCode = idCard.substring(6, 12);

/** 

            Date birthDate = null;

     * 数字验证 

            try {

     *  

                birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));

     * @param str 

            } catch (ParseException e) {

     * @return 

                e.printStackTrace();

     */    

            }

private static boolean isDigital(String str) {    

            Calendar cal = Calendar.getInstance();

return str.matches("^[0-9]*$");    

            if (birthDate != null)

    }    

                cal.setTime(birthDate);

/** 

            if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)),

     * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 

                    Integer.valueOf(birthCode.substring(4, 6)))) {

     *  

                return false;

     * @param bit 

            }

     * @return 

        } else {

     */    

            return false;

private static int getPowerSum(int[] bit) {    

        }

int sum = 0;    

        return true;

if (power.length != bit.length) {    

    }

return sum;    

    /**

        }    

     * 验证10位身份编码是否合法

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

     *

for (int j = 0; j < power.length; j++) {    

     * @param idCard 身份编码

if (i == j) {    

     * @return 身份证信息数组

                    sum = sum + bit[i] * power[j];    

     *         <p>

                }    

     *         [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false)

            }    

     *         若不是身份证件号码则返回null

        }    

     *         </p>

return sum;    

     */

    }    

    public static String[] validateIdCard10(String idCard) {

/** 

        String[] info = new String[3];

     * 将和值与11取模得到余数进行校验码判断 

        String card = idCard.replaceAll("[\(|\)]", "");

     *  

        if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {

     * @param checkCode 

            return null;

     * @param sum17 

        }

     * @return 校验位 

        if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { // 台湾

     */    

            info[0] = "台湾";

private static String getCheckCodeBySum(int sum17) {    

            System.out.println("11111");

String checkCode =null;    

            String char2 = idCard.substring(1, 2);

switch (sum17 % 11) {    

            if (char2.equals("1")) {

case 10:    

                info[1] = "M";

checkCode ="2";    

                System.out.println("MMMMMMM");

break;    

            } else if (char2.equals("2")) {

case 9:    

                info[1] = "F";

checkCode ="3";    

                System.out.println("FFFFFFF");

break;    

            } else {

case 8:    

                info[1] = "N";

checkCode ="4";    

                info[2] = "false";

break;    

                System.out.println("NNNN");

case 7:    

                return info;

checkCode ="5";    

            }

break;    

            info[2] = validateTWCard(idCard) ? "true" : "false";

case 6:    

        } else if (idCard.matches("^[1|5|7][0-9]{6}\(?[0-9A-Z]\)?$")) { // 澳门

checkCode ="6";    

            info[0] = "澳门";

break;    

            info[1] = "N";

case 5:    

            // TODO

checkCode ="7";    

        } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\(?[0-9A]\)?$")) { // 香港

break;    

            info[0] = "香港";

case 4:    

            info[1] = "N";

checkCode ="8";    

            info[2] = validateHKCard(idCard) ? "true" : "false";

break;    

        } else {

case 3:    

            return null;

checkCode ="9";    

        }

break;    

        return info;

case 2:    

    }

checkCode ="x";    

    /**

break;    

     * 验证台湾身份证号码

case 1:    

     *

checkCode ="0";    

     * @param idCard

break;    

     *            身份证号码

case 0:    

     * @return 验证码是否符合

checkCode ="1";    

     */

break;    

    public static boolean validateTWCard(String idCard) {

        }    

        String start = idCard.substring(0, 1);

return checkCode;    

        String mid = idCard.substring(1, 9);

    }    

        String end = idCard.substring(9, 10);

/** 

        Integer iStart = twFirstCode.get(start);

     * 将字符数组转为整型数组 

        Integer sum = iStart / 10 + (iStart % 10) * 9;

     *  

        char[] chars = mid.toCharArray();

     * @param c 

        Integer iflag = 8;

     * @return 

        for (char c : chars) {

     * @throws NumberFormatException 

            sum = sum + Integer.valueOf(c + "") * iflag;

     */    

            iflag--;

private static int[] converCharToInt(char[] c) throws NumberFormatException {    

        }

int[] a = new int[c.length];    

        return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;

int k = 0;    

    }

for (char temp : c) {    

    /**

            a[k++] = Integer.parseInt(String.valueOf(temp));    

     * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)

        }    

     * <p>

return a;    

     * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35

    }    

     * 最后一位校验码为0-9的数字加上字符"A","A"代表10

public static void main(String[] args) throws Exception {    

     * </p>

String idcard15 ="130321860311123";    

     * <p>

String idcard18 ="13022919830501231";   

     * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效

// 15位身份证    

     * </p>

        System.out.println(isValidatedAllIdcard(idcard15));    

     *

// 18位身份证    

     * @param idCard 身份证号码

        System.out.println(isValidatedAllIdcard(idcard18));    

     * @return 验证码是否符合

// 15位身份证转18位身份证    

     */

        System.out.println(convertIdcarBy15bit(idcard15));    

    public static boolean validateHKCard(String idCard) {

    }    

        String card = idCard.replaceAll("[\(|\)]", "");

}    

        Integer sum = 0;

我这里有一个大牛交流群,里面每天更新新的视频新的技术,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以加Java进阶群:454377428,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家

        if (card.length() == 9) {

            sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9

                    + (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;

            card = card.substring(1, 9);

        } else {

            sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;

        }

        String mid = card.substring(1, 7);

        String end = card.substring(7, 8);

        char[] chars = mid.toCharArray();

        Integer iflag = 7;

        for (char c : chars) {

            sum = sum + Integer.valueOf(c + "") * iflag;

            iflag--;

        }

        if (end.toUpperCase().equals("A")) {

            sum = sum + 10;

        } else {

            sum = sum + Integer.valueOf(end);

        }

        return (sum % 11 == 0) ? true : false;

    }

    /**

     * 将字符数组转换成数字数组

     *

     * @param ca

     *            字符数组

     * @return 数字数组

     */

    public static int[] converCharToInt(char[] ca) {

        int len = ca.length;

        int[] iArr = new int[len];

        try {

            for (int i = 0; i < len; i++) {

                iArr[i] = Integer.parseInt(String.valueOf(ca[i]));

            }

        } catch (NumberFormatException e) {

            e.printStackTrace();

        }

        return iArr;

    }

    /**

     * 将身份证的每位和对应位的加权因子相乘之后,再得到和值

     *

     * @param iArr

     * @return 身份证编码。

     */

    public static int getPowerSum(int[] iArr) {

        int iSum = 0;

        if (power.length == iArr.length) {

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

                for (int j = 0; j < power.length; j++) {

                    if (i == j) {

                        iSum = iSum + iArr[i] * power[j];

                    }

                }

            }

        }

        return iSum;

    }

    /**

     * 将power和值与11取模获得余数进行校验码判断

     *

     * @param iSum

     * @return 校验位

     */

    public static String getCheckCode18(int iSum) {

        String sCode = "";

        switch (iSum % 11) {

        case 10:

            sCode = "2";

            break;

        case 9:

            sCode = "3";

            break;

        case 8:

            sCode = "4";

            break;

        case 7:

            sCode = "5";

            break;

        case 6:

            sCode = "6";

            break;

        case 5:

            sCode = "7";

            break;

        case 4:

            sCode = "8";

            break;

        case 3:

            sCode = "9";

            break;

        case 2:

            sCode = "x";

            break;

        case 1:

            sCode = "0";

            break;

        case 0:

            sCode = "1";

            break;

        }

        return sCode;

    }

    /**

     * 根据身份编号获取年龄

     *

     * @param idCard

     *            身份编号

     * @return 年龄

     */

    public static int getAgeByIdCard(String idCard) {

        int iAge = 0;

        if (idCard.length() == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        String year = idCard.substring(6, 10);

        Calendar cal = Calendar.getInstance();

        int iCurrYear = cal.get(Calendar.YEAR);

        iAge = iCurrYear - Integer.valueOf(year);

        return iAge;

    }

    /**

     * 根据身份编号获取生日

     *

     * @param idCard 身份编号

     * @return 生日(yyyyMMdd)

     */

    public static String getBirthByIdCard(String idCard) {

        Integer len = idCard.length();

        if (len < CHINA_ID_MIN_LENGTH) {

            return null;

        } else if (len == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        return idCard.substring(6, 14);

    }

    /**

     * 根据身份编号获取生日年

     *

     * @param idCard 身份编号

     * @return 生日(yyyy)

     */

    public static Short getYearByIdCard(String idCard) {

        Integer len = idCard.length();

        if (len < CHINA_ID_MIN_LENGTH) {

            return null;

        } else if (len == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        return Short.valueOf(idCard.substring(6, 10));

    }

    /**

     * 根据身份编号获取生日月

     *

     * @param idCard

     *            身份编号

     * @return 生日(MM)

     */

    public static Short getMonthByIdCard(String idCard) {

        Integer len = idCard.length();

        if (len < CHINA_ID_MIN_LENGTH) {

            return null;

        } else if (len == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        return Short.valueOf(idCard.substring(10, 12));

    }

    /**

     * 根据身份编号获取生日天

     *

     * @param idCard

     *            身份编号

     * @return 生日(dd)

     */

    public static Short getDateByIdCard(String idCard) {

        Integer len = idCard.length();

        if (len < CHINA_ID_MIN_LENGTH) {

            return null;

        } else if (len == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        return Short.valueOf(idCard.substring(12, 14));

    }

    /**

     * 根据身份编号获取性别

     *

     * @param idCard 身份编号

     * @return 性别(M-男,F-女,N-未知)

     */

    public static String getGenderByIdCard(String idCard) {

        String sGender = "N";

        if (idCard.length() == CHINA_ID_MIN_LENGTH) {

            idCard = conver15CardTo18(idCard);

        }

        String sCardNum = idCard.substring(16, 17);

        if (Integer.parseInt(sCardNum) % 2 != 0) {

            sGender = "M";

        } else {

            sGender = "F";

        }

        return sGender;

    }

    /**

     * 根据身份编号获取户籍省份

     *

     * @param idCard 身份编码

     * @return 省级编码。

     */

    public static String getProvinceByIdCard(String idCard) {

        int len = idCard.length();

        String sProvince = null;

        String sProvinNum = "";

        if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {

            sProvinNum = idCard.substring(0, 2);

        }

        sProvince = cityCodes.get(sProvinNum);

        return sProvince;

    }

    /**

     * 数字验证

     *

     * @param val

     * @return 提取的数字。

     */

    public static boolean isNum(String val) {

        return val == null || "".equals(val) ? false : val.matches("^[0-9]*$");

    }

    /**

     * 验证小于当前日期 是否有效

     *

     * @param iYear

     *            待验证日期(年)

     * @param iMonth

     *            待验证日期(月 1-12)

     * @param iDate

     *            待验证日期(日)

     * @return 是否有效

     */

    public static boolean valiDate(int iYear, int iMonth, int iDate) {

        Calendar cal = Calendar.getInstance();

        int year = cal.get(Calendar.YEAR);

        int datePerMonth;

        if (iYear < MIN || iYear >= year) {

            return false;

        }

        if (iMonth < 1 || iMonth > 12) {

            return false;

        }

        switch (iMonth) {

        case 4:

        case 6:

        case 9:

        case 11:

            datePerMonth = 30;

            break;

        case 2:

            boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0))

                    && (iYear > MIN && iYear < year);

            datePerMonth = dm ? 29 : 28;

            break;

        default:

            datePerMonth = 31;

        }

        return (iDate >= 1) && (iDate <= datePerMonth);

    }

}

版权声明:本文由澳门金莎娱乐发布于关于澳门金莎,转载请注明出处:Java的身份证号码工具类,java验证身份证号码及编码规则和提取相应信息