import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; /** * 验证身份证号码是否合法 * * @author xhh 认为代码还能简化 */ public class Main{ // 判断前17位数是否为数字 public static boolean isNum(String ex) { if (ex.matches("\\d+")) { return true; } else { return false; } } // 判断最后一位数是否为数字或小写字母 public static boolean isNumOrLower(char last) { if (Character.isDigit(last) || (last >= 'a' && last <= 'z')) { return true; } else { return false; } } // 判断日期是否合法 public static boolean isLegal(String birth) { // 准备模板,从字符串中提取出日期数字 SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); try { format.setLenient(false); format.parse(birth); return true; } catch (Exception e) { return false; } } // 校验码检查最后一位 public static boolean checkLast(String ex, char last) { // 将前面的身份证号码17位数分别乘以不同的系数 // 从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2 // 将系数存入int数组中,不可修改 final int[] coeffcients = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 将17位数转化为char数组,再转换成int数组 char[] cArray = ex.toCharArray(); int[] iArray = new int[cArray.length]; int sum = 0; // 将这17位数字和系数相乘的结果相加 int remain = 0; // 用加出来和除以11,取余 // 注意:数字多就不适合使用这种方法 for (int i = 0; i < iArray.length; i++) { iArray[i] = Integer.parseInt(String.valueOf(cArray[i])); sum += iArray[i] * coeffcients[i]; } remain = sum % 11; // 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字 // 其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。 final String[] s = { "1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2" }; // 判断是否和输入的身份证尾数相同 if (s[remain].equals(String.valueOf(last))) { return true; } else { return false; } } public static void main(String[] args) { // 输入18位身份证 Scanner in = new Scanner(System.in); String id = null; // 判断是否输入 if (in.hasNext()) { id = in.next(); } // 判断是否18位 if (id.length() == 18) { // 获取前17位数 String exString = id.substring(0, 17); // 获取最后一位数 char lastChar = id.charAt(17); // 获取生日 String birth = id.substring(6, 14); // 判断身份证是否合法 if (isNum(exString) && isNumOrLower(lastChar) && isLegal(birth) && checkLast(exString, lastChar)) { // 准备模板,从字符串中提取出日期数字 SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd"); // 准备模板,将提取后的日期数字变为指定的格式 SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format1.parse(birth); System.out.println(format2.format(date)); // 输出有效日期 } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("0000-00-00"); } } else { System.out.println("0000-00-00"); } } }