项目中有个需求:根据身份证号判断做社保卡申领的人是否是16岁以下(含16岁)的未成年人,是的话,需要父母陪伴
我的实现思路:
就是通过身份证号码先判断出这个人是多少岁,然后在跟当前时间做对比,重要的一点是临界时间的判断,也就是刚好是16的差值,那就需要再通过判断月份和日期来做判断,是否符合条件
为了通用,我把方法封装了一下,可以输入年龄,然后判断是否是在多少岁年龄一下,还可以设置是否包含当前年龄
核心代码如下:
1、获取真实的年龄
/**
* 获取真实的年龄
*
* @param idNum
* @return
*/
public static int getRealYear(String idNum) {
Calendar cal = Calendar.getInstance();
//当前年
int currentYear = cal.get(Calendar.YEAR);
//当前月
int currentMonth = (cal.get(Calendar.MONTH)) + 1;
//当前月的第几天:即当前日
int currentDay = cal.get(Calendar.DAY_OF_MONTH);
int birthYear = 0;
int birthMonth = 0;
int birthDay = 0;
int realYear = 0;
if (!TextUtils.isEmpty(idNum)) {
String birthDate = idNum.substring(6, 14);
if (!TextUtils.isEmpty(birthDate) && birthDate.length() == 8) {
birthYear = Integer.valueOf(birthDate.substring(0, 4));
birthMonth = Integer.valueOf(birthDate.substring(4, 6));
birthDay = Integer.valueOf(birthDate.substring(6, 8));
}
realYear = currentYear - birthYear;
if (birthMonth > currentMonth) {
realYear = realYear - 1;
} else if (birthMonth == currentMonth) {
if (birthDay > currentDay) {
realYear = realYear - 1;
} else {
realYear = realYear;
}
} else {
realYear = realYear;
}
}
return realYear;
}
2、判断是否小于或者等于当前项目中规定的年龄
/**
* 判断是否小于或者等于当前age的年龄
*
* @param age
* @return
*/
public static boolean isChildUnderTargetAge(String idNum, int age, boolean isIncludeAge) {
int realYear = getRealYear(idNum);
if (isIncludeAge) {
if (realYear <= age) {
return true;
} else {
return false;
}
} else {
if (realYear < age) {
return true;
} else {
return false;
}
}
}
3、符合16岁以下(含16岁)
/**
* 判断是否 是 > 2002年出生的 就是符合16岁以下(含16岁)
*
* @param birthDay
* @return
*/
public static boolean isChildUnder16(String birthDay) {
return isChildUnderTargetAge(birthDay, 16, true);
}
4、代码中调用
boolean isChildUnder16 = IdcardUtils.isChildUnder16(mBean.sfzh);