首页 > 代码库 > Java验证身份证号码及提取生日信息
Java验证身份证号码及提取生日信息
Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息。第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正题。
问题说明:目前,我国大部分地区都使用的是第二代身份证,第二代身份证号码的位数为18位。但公安部没有下发统一的关于停用第一代身份证的文件,第一代身份证中有15位和18位身份证号的混用。
15位身份证号码:排列顺序从左至右依次为:6位数字地址码,6位数字出生日期码,3位数字顺序码,其中出生日期码不包含世纪数。
18位身份证号码:公民身份号码是特征组合码,由17位数字码和1位校验码组成。排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位数字校验码。
【地址码】:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
前两位代码表示省、自治区、直辖市、特别行政区:
——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:"国外"
中间两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中:
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码;
——21~50表示地区、自治州、盟;
——90表示省(自治区)直辖县级行政区划汇总码。
最后两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中:
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码;
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区;
——81~99表示省(自治区)辖县级市。
【出生日期码】:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
【随机码】:生日编码之后的两位为随机生成数。
【顺序码】:顺序码的奇数分给男性,偶数分给女性。
【校验码】:是根据前面十七位数字码计算出来的,计算方法如下:
Index = ∑(a[i]*W[i]) mod 11 ( i = 0, 1, ..., 16 )
a[i]: 表示身份证号码第 i 位上的数字值
W[i]: 表示第 i 位上的加权因子 ,W={7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2}。
身份证号码的校验码 = R[Index],R={1 0 X 9 8 7 6 5 4 3 2}。
由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。
思路分析: 针对给出的身份证组成信息验证身份证号是否合法。1. 验证身份证号是否是15位或者18位;2. 验证身份证号是否都是由数字组成;3. 验证身份证号的前两位是否属于行政区化代码中;4.验证身份证号的生日信息是否正确;5.对于18位的身份证号,验证校验码是否正确。
参考博客:http://www.cnblogs.com/tenking/archive/2009/12/07 /2075290.html;
http://love3400wind.blog.163.com/blog/static /7963080120095862446850/
1 package idcard; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 6 public class isLegalToIDNumber { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 String[] strIDNumberArr = {"53010119810602001x","330521197411044030","53010119810602007x"}; 11 for (int i = 0; i < strIDNumberArr.length; ++i){ 12 if (isLegal(strIDNumberArr[i])){ 13 System.out.println(strIDNumberArr[i] + "为正确的身份证号。"); 14 displayBirthDate(strIDNumberArr[i]); 15 } 16 else{ 17 System.out.println(strIDNumberArr[i] + "为错误身份证号。"); 18 } 19 } 20 } 21 22 public static boolean isLegal(String strID){ 23 boolean flag = true; 24 //判断输入的字符串是否为空 25 if ((strID == null) || (strID.length() <= 0) || strID.equals("")){ 26 flag = false; 27 } 28 //判断输入的字符串长度是否为15或者18 29 if (strID.length() != 15 && strID.length() != 18){ 30 flag = false; 31 } 32 //判断输入的字符串是否都为数字 33 if (!isDigit(strID)){ 34 flag = false; 35 } 36 //判断身份证号的前两位是否正确 37 if (!isCorrectFirstTwo(strID.substring(0,2))){ 38 flag = false; 39 } 40 //验证生日是否正确 41 String strBirthDay = ""; 42 if (strID.length() == 15){ 43 strBirthDay = "19" + strID.substring(6,12); 44 } 45 else{ 46 strBirthDay = strID.substring(6,14); 47 } 48 if (!isCorrectBirthDay(strBirthDay)){ 49 flag = false; 50 } 51 //验证18位身份证号的校验码是否正确 52 if (strID.length() == 18){ 53 if (!isCheckCode(strID)){ 54 flag = false; 55 } 56 } 57 return flag; 58 } 59 60 public static void displayBirthDate(String strID){ 61 String strYear = ""; 62 String strMonth = ""; 63 String strDay = ""; 64 65 if (strID.length() == 15){ 66 strYear = "19" + strID.substring(6,8); 67 strMonth = strID.substring(8,10); 68 strDay = strID.substring(10,12); 69 } 70 71 if (strID.length() == 18){ 72 strYear = strID.substring(6,10); 73 strMonth = strID.substring(10,12); 74 strDay = strID.substring(12,14); 75 } 76 77 System.out.println("生日日期为:" + strYear + "年" + strMonth + "月" + strDay + "日"); 78 } 79 80 public static boolean isCheckCode(String strID){ 81 // 每位加权因子 82 final int arrWeight[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; 83 // 第18位校检码 84 final String strArrCheckCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", 85 "4", "3", "2" }; 86 //将身份证号前17位存入数组,进行下一步计算 87 int[] arrID = new int[17]; 88 for (int i = 0; i < 17; ++i){ 89 arrID[i] = Integer.parseInt(strID.substring(i, i + 1)); 90 } 91 int nSum = 0; 92 for (int i = 0; i < 17; ++i){ 93 nSum += arrID[i] * arrWeight[i]; 94 } 95 int nIdx = nSum % 11; 96 String strLast = strID.substring(17); 97 if (strArrCheckCode[nIdx].equals(strLast)){ 98 return true; 99 } 100 else{ 101 return false; 102 } 103 } 104 105 public static boolean isCorrectBirthDay(String strDate){ 106 int nYear = Integer.parseInt(strDate.substring(0, 4)); 107 int nMonth = Integer.parseInt(strDate.substring(4, 6)); 108 int nDay = Integer.parseInt(strDate.substring(6, 8)); 109 //获取系统当前的日期,判断是否在当前日期之前 110 Date curDate = new Date(); 111 Calendar cal = Calendar.getInstance(); 112 cal.setTime(curDate); 113 if (nYear > cal.get(Calendar.YEAR)){ 114 return false; 115 } 116 //判断是否为合法月份 117 if (nMonth < 1 || nMonth > 12){ 118 return false; 119 } 120 //判断是否为合法日期 121 boolean bFlag = false; 122 switch(nMonth){ 123 case 1: 124 case 3: 125 case 5: 126 case 7: 127 case 8: 128 case 10: 129 case 12: 130 if (nDay >= 1 && nDay <= 31){ 131 bFlag = true; 132 } 133 break; 134 case 2: 135 if ((((nYear % 4 == 0) && (nYear % 100 != 0))|| (nYear % 400 == 0))){ 136 if (nDay >=1 && nDay <= 29){ 137 bFlag = true; 138 } 139 } 140 else{ 141 if (nDay >=1 && nDay <= 28){ 142 bFlag = true; 143 } 144 } 145 break; 146 case 4: 147 case 6: 148 case 9: 149 case 11: 150 if (nDay >= 1 && nDay <= 30){ 151 bFlag = true; 152 } 153 break; 154 } 155 if (!bFlag){ 156 return false; 157 } 158 return true; 159 } 160 161 public static boolean isCorrectFirstTwo(String strID12){ 162 final String strArrCityCode[] = { "11", "12", "13", "14", "15", "21", "22", 163 "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", 164 "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", 165 "64", "65", "71", "81", "82", "91" }; 166 boolean bFlag = false; 167 for (String strIdx : strArrCityCode){ 168 if (strIdx.equalsIgnoreCase(strID12)) 169 { 170 bFlag = true; 171 break; 172 } 173 } 174 if (bFlag){ 175 return true; 176 } 177 return false; 178 } 179 180 public static boolean isDigit(String strID){ 181 int nDigitCnt = 0; 182 int nLength = (strID.length() == 15)? strID.length() : (strID.length() - 1); 183 for (int i = 0; i < nLength; ++i){ 184 char cTmp = strID.charAt(i); 185 if (cTmp >= ‘0‘ && cTmp <= ‘9‘){ 186 ++nDigitCnt; 187 } 188 } 189 if (nDigitCnt != nLength){ 190 return false; 191 } 192 else{ 193 return true; 194 } 195 } 196 197 198 }