根据身份证获取性别、年龄、出生日期

235 阅读3分钟
package com.api.util.hmo;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.api.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;

public class IDCardUtil {

    /**
     * 15位身份证号
     */
    private static final Integer FIFTEEN_ID_CARD = 15;
    /**
     * 18位身份证号
     */
    private static final Integer EIGHTEEN_ID_CARD = 18;
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 根据身份证号获取性别
     * @param idCard 身份证号
     * @return 
     */
    public static String getSex(String idCard) {
        String sex = "";
        if (StringUtils.isNotBlank(idCard)) {
            //15位身份证号
            if (idCard.length() == FIFTEEN_ID_CARD) {
                if (Integer.parseInt(idCard.substring(14, 15)) % 2 == 0) {
                    sex = "女";
                } else {
                    sex = "男";
                }
                //18位身份证号
            } else if (idCard.length() == EIGHTEEN_ID_CARD) {
                // 判断性别
                if (Integer.parseInt(idCard.substring(16).substring(0, 1)) % 2 == 0) {
                    sex = "女";
                } else {
                    sex = "男";
                }
            }
        }
        return sex;
    }

    /**
     * 根据身份证号获取年龄
     * @param idCard 身份证号
     * @return
     */
    public static Integer getAge(String idCard) {
        Integer age = 0;
        Date date = new Date();
        if (StringUtils.isNotBlank(idCard) && isValid(idCard)) {
            //15位身份证号
            if (idCard.length() == FIFTEEN_ID_CARD) {
                // 身份证上的年份(15位身份证为1980年前的)
                String uyear = "19" + idCard.substring(6, 8);
                // 身份证上的月份
                String uyue = idCard.substring(8, 10);
                // 当前年份
                String fyear = format.format(date).substring(0, 4);
                // 当前月份
                String fyue = format.format(date).substring(5, 7);
                if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) {
                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
                    // 当前用户还没过生
                } else {
                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
                }
                //18位身份证号
            } else if (idCard.length() == EIGHTEEN_ID_CARD) {
                // 身份证上的年份
                String year = idCard.substring(6).substring(0, 4);
                // 身份证上的月份
                String yue = idCard.substring(10).substring(0, 2);
                // 当前年份
                String fyear = format.format(date).substring(0, 4);
                // 当前月份
                String fyue = format.format(date).substring(5, 7);
                // 当前月份大于用户出身的月份表示已过生日
                if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) {
                    age = Integer.parseInt(fyear) - Integer.parseInt(year);
                    // 当前用户还没过生日
                } else {
                    age = Integer.parseInt(fyear) - Integer.parseInt(year);
                }
            }
        }
        return age;
    }

    /**
     * 获取出生日期  yyyy年MM月dd日
     * @param idCard 身份证
     * @param slash  分隔符 - or /
     * @return
     */
    public static String getBirthday(String idCard, String slash) {
        String birthday = "";
        String year = "";
        String month = "";
        String day = "";
        if (StringUtils.isNotBlank(idCard)) {
            //15位身份证号
            if (idCard.length() == FIFTEEN_ID_CARD) {
                // 身份证上的年份(15位身份证为1980年前的)
                year = "19" + idCard.substring(6, 8);
                //身份证上的月份
                month = idCard.substring(8, 10);
                //身份证上的日期
                day = idCard.substring(10, 12);
                //18位身份证号
            } else if (idCard.length() == EIGHTEEN_ID_CARD) {
                // 身份证上的年份
                year = idCard.substring(6).substring(0, 4);
                // 身份证上的月份
                month = idCard.substring(10).substring(0, 2);
                //身份证上的日期
                day = idCard.substring(12).substring(0, 2);
            }else {
                return birthday;
            }
            birthday = year + slash + month + slash + day;
        }
        return birthday;
    }

    /**
     * 获取出生日期  yyyy-MM-dd
     *
     * @param idCard 身份证号码
     * @return LocalDate yyyy-MM-dd
     */
    public static LocalDate getBirthday(String idCard) {
        String birthday = "";
        String year = "";
        String month = "";
        String day = "";
        String slash = "-";
        if (StringUtils.isNotBlank(idCard)) {
            //15位身份证号
            if (idCard.length() == FIFTEEN_ID_CARD) {
                // 身份证上的年份(15位身份证为1980年前的)
                year = "19" + idCard.substring(6, 8);
                //身份证上的月份
                month = idCard.substring(8, 10);
                //身份证上的日期
                day = idCard.substring(10, 12);
                //18位身份证号
            } else if (idCard.length() == EIGHTEEN_ID_CARD) {
                // 身份证上的年份
                year = idCard.substring(6).substring(0, 4);
                // 身份证上的月份
                month = idCard.substring(10).substring(0, 2);
                //身份证上的日期
                day = idCard.substring(12).substring(0, 2);
            } else {
                return null;
            }
            birthday = year + slash + month + slash + day;
            return LocalDateTimeUtil.parseDate(birthday);
        }
        return null;
    }

    /**
     * 身份证验证
     *
     * @param id 号码内容
     * @return 是否有效
     */
    public static boolean isValid(String id) {
        boolean validResult = true;
        //校验长度只能为15或18
        int len = id.length();
        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD) {
            validResult = false;
        }
        //校验生日
        if (!validDate(id)) {
            validResult = false;
        }
        return validResult;
    }

    /**
     * 校验生日
     *
     * @param id
     * @return
     */
    private static boolean validDate(String id) {
        try {
            String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Date birthDate = sdf.parse(birth);
            if (!birth.equals(sdf.format(birthDate))) {
                return false;
            }
        } catch (ParseException e) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String card = "410426199903052427";
        String sex = getSex(card);
        System.out.println("sex :" + sex);
        Integer age = getAge(card);
        System.out.println("age :" + age);
        String birthday = getBirthday(card, "/");
        System.out.println("birthday: " + birthday);
    }
    
    //sex :女
    age :25
    birthday: 1999/03/05
}