/**
* 检验身份证号码
* @param idCard
* @return
*/
public static boolean checkIDCard(String idCard){
Pattern chinaPattern = Pattern
.compile("(^\\d{15}$)|(^\\d{17}([0-9]|X)$)");
Matcher matcher = chinaPattern.matcher(idCard);
if (!matcher.matches()) {
return false;
}
HashMap<Integer,String> cityMap = new HashMap<>();
cityMap.put(11,"北京");
cityMap.put(12,"天津");
cityMap.put(13,"河北");
cityMap.put(14,"山西");
cityMap.put(15,"内蒙古");
cityMap.put(21,"辽宁");
cityMap.put(22,"吉林");
cityMap.put(23,"黑龙江");
cityMap.put(31,"上海");
cityMap.put(32,"江苏");
cityMap.put(33,"浙江");
cityMap.put(34,"安徽");
cityMap.put(35,"福建");
cityMap.put(36,"江西");
cityMap.put(37,"山东");
cityMap.put(41,"河南");
cityMap.put(42,"湖北");
cityMap.put(43,"湖南");
cityMap.put(44,"广东");
cityMap.put(45,"广西");
cityMap.put(46,"海南");
cityMap.put(50,"重庆");
cityMap.put(51,"四川");
cityMap.put(52,"贵州");
cityMap.put(53,"云南");
cityMap.put(54,"西藏");
cityMap.put(61,"陕西");
cityMap.put(62,"甘肃");
cityMap.put(63,"青海");
cityMap.put(64,"宁夏");
cityMap.put(65,"新疆");
cityMap.put(71,"台湾");
cityMap.put(81,"香港");
cityMap.put(82,"澳门");
cityMap.put(91,"国外");
Set<Integer> keys = cityMap.keySet();
if (!keys.contains(Integer.parseInt(idCard.substring(0, 2)))) {
return false;
}
int length = idCard.length();
if (length == 15) {
Pattern pattern = Pattern
.compile("^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$");
Matcher matcher1 = pattern.matcher(idCard);
if (matcher1.matches()) {
String str = "19"+matcher1.group(2)+"/"+matcher1.group(3)+"/"+matcher1.group(4);
//指定转换格式
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//进行转换
LocalDate date = LocalDate.parse(str, fmt);
String year = "19"+matcher1.group(2);
if (!(date.getYear() == Integer.parseInt(year)
&& date.getMonthValue() == Integer.parseInt(matcher1.group(3))
&& date.getDayOfMonth() == Integer.parseInt(matcher1.group(4)))) {
return false;
} else {
return true;
}
}
}
if (length == 18) {
Pattern pattern = Pattern
.compile("^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$");
Matcher matcher1 = pattern.matcher(idCard);
if (matcher1.matches()) {
String str = matcher1.group(2)+"/"+matcher1.group(3)+"/"+matcher1.group(4);
//指定转换格式
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//进行转换
LocalDate date = LocalDate.parse(str, fmt);
if (!(date.getYear() == Integer.parseInt(matcher1.group(2))
&& date.getMonthValue() == Integer.parseInt(matcher1.group(3))
&& date.getDayOfMonth() == Integer.parseInt(matcher1.group(4)))) {
return false;
} else {
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10
Integer[] arrInt = new Integer[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
String[] arrCh = new String[]{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int nTemp = 0;
for (int i = 0; i < 17; i++) {
nTemp += Integer.parseInt(idCard.substring(i,i+1)) * arrInt[i];
}
String valNum = arrCh[nTemp % 11];
return valNum.equals(idCard.substring(17, 18));
}
}
}
return true;
}