前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >身份证工具类

身份证工具类

原创
作者头像
在下是首席架构师
发布2023-11-30 09:48:21
1980
发布2023-11-30 09:48:21
举报
文章被收录于专栏:从入门到出门从入门到出门
代码语言:java
复制
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.regex.Pattern;


/**
 * 身份证工具类
 *
 * @author xuyt
 * @date 2023/05/06
 **/
@Data
public class IdCardUtil {
    /**
     * 15位身份证号
     */
    private static final Integer FIFTEEN_ID_CARD = 15;
    /**
     * 18位身份证号
     */
    private static final Integer EIGHTEEN_ID_CARD = 18;
    public static final int BEGIN_INDEX = 14;
    public static final int END_INDEX = 15;
    public static final int BEGIN_INDEX1 = 16;
    public static final int MODULO = 2;

    private static Pattern pattern = Pattern.compile("^(\\d{18}|\\d{15}|\\d{17}X)$");
    /**
     * 根据身份证号获取性别, 0=男,1=女
     */
    public static Pair<Integer, String> getSex(String idCard) {
        int sexInt = 0;
        String sexString = "";
        if (StringUtils.isNotBlank(idCard)) {
            //15位身份证号
            if (idCard.length() == FIFTEEN_ID_CARD) {
                if (Integer.parseInt(idCard.substring(BEGIN_INDEX, END_INDEX)) % MODULO == 0) {
                    sexString = "女";
                    sexInt = 1;
                } else {
                    sexString = "男";
                    sexInt = 0;
                }
                //18位身份证号
            } else if (idCard.length() == EIGHTEEN_ID_CARD) {
                // 判断性别
                if (Integer.parseInt(idCard.substring(BEGIN_INDEX1).substring(0, 1)) % MODULO == 0) {
                    sexString = "女";
                    sexInt = 1;
                } else {
                    sexString = "男";
                    sexInt = 0;
                }
            }
        }
        return new ImmutablePair<>(sexInt, sexString);
    }

    /**
     * 根据身份证号获取年龄
     */
    public static Integer getAge(String idCard) {
        int age = 0;
        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);
                // 当前年份
                int fyear = LocalDate.now().getYear();
                // 当前月份
                int fyue = LocalDate.now().getMonth().getValue();
                if (Integer.parseInt(uyue) <= fyue) {
                    age = fyear - Integer.parseInt(uyear) + 1;
                    // 当前用户还没过生
                } else {
                    age = 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);
                // 当前年份
                int fyear = LocalDate.now().getYear();
                // 当前月份
                int fyue = LocalDate.now().getMonth().getValue();
                //计算周岁
                age = fyear - Integer.parseInt(year) - 1;
                // 当前月份大于用户出身的月份表示已过生日
                if (Integer.parseInt(yue) <= fyue) {
                    age = age + 1;
                    // 当前用户还没过生日
                }
            }
        }
        return age;
    }

    /**
     * 获取出生日期  yyyy年MM月dd日
     */
    public static String getBirthday(String idCard) {
        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);
            }
            birthday = year + "-" + month + "-" + day;
        }
        return birthday;
    }

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

    /**
     * 校验生日
     */
    private static boolean validBirthDate(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;
    }

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com