@Slf4j
public class IdCardNoUtils {
private static SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd")
/**
*18位身份证号码: 第17位代表性别,奇数为男,偶数为女
* @param idCardNo
* @return
*/
public static String getSex(String idCardNo) {
if (idCardNo == null || idCardNo.length() != 18) {
return ""
}
char c = idCardNo.charAt(16)
int sex = Integer.valueOf(c)
return sex % 2 == 0 ? "女" : "男"
}
/**
*18位身份证号码: 第7-14位代表yyyyMMdd
* @param idCardNo
* @return
*/
public static Date getBirthday(String idCardNo) {
if (idCardNo == null || idCardNo.length() != 18) {
throw new BusinessException("身份证格式有误!")
}
String birthdayStr = idCardNo.substring(6, 14)
Date birthday = null
try {
birthday = formatter.parse(birthdayStr)
} catch (ParseException e) {
log.warn("日期格式转化错误! birthday:" + birthday, e)
}
return birthday
}
/**
*18位身份证号码: 第7-14位代表yyyyMMdd,可用来计算年龄
* @param idCardNo
* @return
*/
public static int getAge(String idCardNo) {
if (idCardNo == null || idCardNo.length() != 18) {
return -1
}
String birthday = idCardNo.substring(6, 14)
Date birthdayDate = null
try {
birthdayDate = formatter.parse(birthday)
} catch (ParseException e) {
log.warn("日期格式转化错误! birthday:" + birthday, e)
}
return getAgeByDate(birthdayDate)
}
/**
* 计算年龄,精确到天
* @param birthday
* @return
*/
private static int getAgeByDate(Date birthday) {
Calendar calendar = Calendar.getInstance()
if (calendar.getTimeInMillis() - birthday.getTime() < 0L) {
return -1
}
//当前的年月日
int yearNow = calendar.get(Calendar.YEAR)
int monthNow = calendar.get(Calendar.MONTH)
int dayNow = calendar.get(Calendar.DAY_OF_MONTH)
//生日的年月日
calendar.setTime(birthday)
int yearBirthday = calendar.get(Calendar.YEAR)
int monthBirthday = calendar.get(Calendar.MONTH)
int dayBirthday = calendar.get(Calendar.DAY_OF_MONTH)
int age = yearNow - yearBirthday
//月份或日子没满
if (monthNow < monthBirthday || (monthNow == monthBirthday && dayNow < dayBirthday)) {
age = age - 1
}
return age
}