主要思路很简单:
1.通过当前年份和用户出生年份相减计算出age :用户当年还没过生的话,age要减一。
2.在身份证截取根据“月日”拼接成开头可以为0的四位数int值。根据当前月日值和用户出生月日对比大小,一步判断age是否要减一。避免了月份判断月份相同等和日期的繁琐判断。
例如用户:2000-12/15 生日 (int)1215>1128,用户 age=22-1=21
用户:2000-05/23 生日 (int)0523<1128 , 用户 age=22
以下就是代码实现,身份证截取2000(年)、1215(月日),当前时间转成 yyyy-MMdd 也截取相同的值计算。再加上字符长度合法性校验,以及18位和15位身份证的按条件赋值。
public static int countAge(String idCard) {
if (idCard.length() != 18 && idCard.length() != 15) {
throw new IllegalArgumentException("身份证号长度错误");
}
String year;
String monthDay;
if (idCard.length() == 18) {
year = idCard.substring(6,10);
monthDay = idCard.substring(10,14);
} else {
year = "19" + idCard.substring(6, 8);
monthDay = idCard.substring(8, 12);
}
//获取当前时间字符串如:2022-1128
String nowTimeStr = new SimpleDateFormat("yyyy-MMdd").format(new Date());
String yearNow = nowTimeStr.substring(0, 4);// 当前年份
String monthDayNow = nowTimeStr.substring(5, 9);// 当前月日
int age = Integer.parseInt(yearNow) - Integer.parseInt(year);
//age减一的情况 :用户月日大于当前月日(开头可以为0的4位数int)
if (Integer.parseInt(monthDay) > Integer.parseInt(monthDayNow)) {
age = age - 1;
}
return age;
}