代码语言: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;
}
}