Java 身份证号获取性别和出生日期

引言

在日常生活中,我们经常会遇到需要根据身份证号来获取相关信息的场景,比如获取性别和出生日期。尤其在一些需要年龄、性别等信息进行验证或统计的业务场景中,对身份证号的解析变得尤为重要。本文将介绍如何使用 Java 编程语言来解析身份证号,获取其中的性别和出生日期。

身份证号的结构

身份证号是一串由数字和字母组成的字符串,其中包含了个人的身份信息,如性别、出生日期、所在地等。身份证号的结构如下所示:

XXXXXXXXYYYYMMDDZZZP

其中:

  • XXXXXXXX:表示地区代码,代表了发证地的行政区划代码;
  • YYYY:表示出生年份,如 1990 年,则为 1990;
  • MM:表示出生月份,如 5 月,则为 05;
  • DD:表示出生日期,如 15 日,则为 15;
  • ZZZ:表示顺序码,用于区分同一地区同一天出生的不同人;
  • P:表示性别码,奇数为男性,偶数为女性。

身份证号的校验

身份证号的最后一位是校验码,用于校验身份证号的合法性。校验码的计算方法如下:

  1. 将身份证号前 17 位的系数与对应位数上的数字相乘,得到乘积;
  2. 将乘积相加的结果除以 11,得到余数;
  3. 根据余数,查找对应的身份证号最后一位的校验码。

具体的计算过程如下所示:

public class IdCardUtils {
    public static char calculateVerifyCode(String idCardNumber) {
        char[] idCardArray = idCardNumber.toCharArray();
        
        int sum = 0;
        int[] coefficientArray = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        char[] verifyCodeArray = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

        for (int i = 0; i < 17; i++) {
            sum += Character.digit(idCardArray[i], 10) * coefficientArray[i];
        }

        int remainder = sum % 11;
        return verifyCodeArray[remainder];
    }
}

性别和出生日期的提取

在了解了身份证号的结构和校验码的计算方法后,我们可以使用 Java 编写代码来获取身份证号中的性别和出生日期。下面是一个示例:

public class IdCardUtils {
    public static String getGender(String idCardNumber) {
        char genderCode = idCardNumber.charAt(idCardNumber.length() - 2);
        if (Character.isDigit(genderCode)) {
            int genderValue = Character.getNumericValue(genderCode);
            return genderValue % 2 == 0 ? "女" : "男";
        }
        return null;
    }

    public static LocalDate getBirthDate(String idCardNumber) {
        String birthDateStr = idCardNumber.substring(6, 14);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        return LocalDate.parse(birthDateStr, formatter);
    }
}

在上述代码中,我们使用 String 类的 charAt() 方法获取身份证号倒数第二位的字符,该字符表示性别码。我们使用 Character.isDigit() 方法判断该字符是否是数字,然后根据性别码的奇偶性确定性别。对于出生日期的获取,我们使用 String 类的 substring() 方法截取身份证号中的出生日期部分,然后使用 LocalDate 类和 DateTimeFormatter 类来解析日期字符串。

类图

下面是身份证号解析的类图:

classDiagram
    class IdCardUtils {
        +calculateVerifyCode(String idCardNumber): char
        +getGender(String idCardNumber): String
        +getBirthDate(String idCardNumber): LocalDate
    }

状态