public static boolean isLeapYear(String year) { Long yearL = Long.parseLong(year); if ((yearL % 4 == 0) && (yearL % 100 != 0) || (yearL % 400 == 0)) { return true; } return false; }
写一个方法获取一年中某个月对应的天数
public static int getDays(String year, int month) { int days = 0; switch (month) { case 1: days = 31; break; case 3: days = 31; break; case 5: days = 31; break; case 7: days = 31; break; case 8: days = 31; break; case 10: days = 31; break; case 12: days = 31; break; case 2: if (isLeapYear(year)) days = 29; else days = 28; break; default: days = 30; } return days; }
有了上面的两个方法,在下面的方法中进行调用来判断身份证号码是否是正确
public static boolean validateIdNumber(String idNumber) { // Pattern p1 = Pattern.compile("(\\d{17}[0-9xX]|\\d{14}[0-9xX])"); Matcher matcher = p1.matcher(idNumber); if (matcher.matches()) { Pattern p2 = Pattern.compile("\\d{6}(\\d{8}).*"); // 用于提取出生日字符串 Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日 Matcher matcher2 = p2.matcher(idNumber); boolean flag = matcher2.find(); if (flag) { String date = matcher2.group(1); Matcher matcher3 = p3.matcher(date); if (matcher3.find()) { String year = matcher3.group(1); int month = Integer.parseInt(matcher3.group(2)); int day = Integer.parseInt(matcher3.group(3)); if (month < 1 || month > 12) { return false; } if (day > getDays(year, month) || day < 1) { return false; } return true; } } } return false; }
这个方法基本能满足验证身份证号码是否符合规则,不过也有缺陷没有办法来判断地区行政代码是否正确。因为地区代码会有调整,很难控制。