找了几个网上的博客计算年龄测试用例都通不过,只能自己写了!!!!!
首先要知道身份证有一代和二代,目前几乎都是二代吧
/**
* 身份证相关功能计算
*/
public class IdCardUtils {
/**
* 通过身份证计算年龄
*
* @return
*/
private static int countAge(String idCard) {
if(idCard.length() != 18 && idCard.length() != 15){
throw new IllegalArgumentException("身份证号长度错误");
}
String birthTimeString = null;
if(idCard.length() == 18){
birthTimeString = idCard.substring(6, 10) + "-" + idCard.substring(10, 12) + "-" + idCard.substring(12, 14);
}else{
birthTimeString = "19" + idCard.substring(6, 8) + "-" + idCard.substring(8, 10) + "-" + idCard.substring(10, 12);
}
if (birthTimeString == null) {
throw new IllegalArgumentException("身份证号长度错误");
}
// 先截取到字符串中的年、月、日
String strs[] = birthTimeString.trim().split("-");
int birthYear = Integer.parseInt(strs[0]);
int birthMonth = Integer.parseInt(strs[1]);
int birthDay = Integer.parseInt(strs[2]);
// 得到当前时间的年、月、日
LocalDateTime now = LocalDateTime.now();
int yearNow = now.getYear();
int monthNow = now.getMonthValue();
int dayNow = now.getDayOfMonth();
// 用当前年月日减去生日年月日
int yearMinus = yearNow - birthYear;
int monthMinus = monthNow - birthMonth;
int dayMinus = dayNow - birthDay;
int age = yearMinus-1;
if (yearMinus < 0 || age < 0) { //未出生
age = 0;
return age;
}
//如果月份大于0说明已经过了生日
if (monthMinus > 0) {
age++;
return age;
}
//当月出生且出生日大于了当天
if (monthMinus == 0 && dayMinus >= 0) {
age++;
}
return age;
}
/**
* 通过身份证计算性别
* @param idCard
* @return
*/
public static String getGender(String idCard) {
if (idCard.length() != 18 && idCard.length() != 15) {
throw new IllegalArgumentException("身份证号长度错误");
}
Integer gend = null;
if (idCard.length() == 18) {
gend = Integer.parseInt(String.valueOf(idCard.charAt(idCard.length() - 2)));
} else {
gend = Integer.parseInt(String.valueOf(idCard.charAt(idCard.length() - 1)));
}
if (gend % 2 == 1) {
return "男";
}
return "女";
}
public static void main(String[] args) {
int i = countAge("510525202009236850");
// int i = countAge("510525690402670");
System.out.println(getGender("510521199707086852"));
System.out.println(i);
}