java 根据身份证计算年龄(周岁)

最近做的项目需要根据身份证来计算年龄,于是自己写了一段代码,看了网上的一些计算年龄的代码,发现和我的思路有点不一样,所以才记录下这段代码。

验证身份证的出生年月日是否合法(部分代码):

    // 判断出生年月是否有效
	String strYear = idcard.substring(6, 10);// 年份
	String strMonth = idcard.substring(10, 12);// 月份
        String strDay = idcard.substring(12, 14);// 日期
		
	//身份证出生日期无效
	if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
		return false;
	}
		
	GregorianCalendar gc = new GregorianCalendar();
	SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
		
	try {
	//身份证生日不在有效范围
		if ((gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
			return false;
		}
	} catch (NumberFormatException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	}
	//身份证月份无效
	if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
		return false;
	}
	//身份证日期无效
	if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
		return false;
	}

isDate()方法:

   /**
	 * 功能:判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天
	 * 
	 * @param string
	 * @return
	 */
   public static boolean isDate(String strDate) {
	Pattern pattern = Pattern.compile(
				"^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$");
	Matcher m = pattern.matcher(strDate);
	if (m.matches()) {
		return true;
	} else {
		return false;
	}
   }

计算年龄:

 //截取出生年月日
String birthday = pensonnelIdCard.substring(6, 14);
 //当前日期
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
//计算年龄差
Integer ageBit = Integer.parseInt(date) - Integer.parseInt(birthday);
//当年龄差的长度大于4位时,即出生年份小于当前年份
if (ageBit.toString().length() > 4) {
//截取掉后四位即为年龄
   Integer personAge = Integer.parseInt(ageBit.toString().substring(0, ageBit.toString().length() - 4));
}else {//当前年份出生,直接赋值为0岁
   Integer personAge = 0;
}

附上另一种计算方法:

/**
	 * 根据身份证号计算年龄
	 * @param pensonnelIdCard
	 * @return
	 */
	public Integer getPersonAgeFromIdCard(String pensonnelIdCard) {
		
		//截取身份证中出行人出生日期中的年、月、日
		Integer personYear = Integer.parseInt(pensonnelIdCard.substring(6, 10));
		Integer personMonth = Integer.parseInt(pensonnelIdCard.substring(10, 12));
		Integer personDay = Integer.parseInt(pensonnelIdCard.substring(12, 14));
		
		Calendar cal = Calendar.getInstance();
		// 得到当前时间的年、月、日
		Integer yearNow = cal.get(Calendar.YEAR);
		Integer monthNow = cal.get(Calendar.MONTH) + 1;
		Integer dayNow = cal.get(Calendar.DATE);
		
		// 用当前年月日减去生日年月日
		Integer yearMinus = yearNow - personYear;
		Integer monthMinus = monthNow - personMonth;
		Integer dayMinus = dayNow - personDay;
 
		Integer age = yearMinus; //先大致赋值
		
		if (yearMinus == 0) { //出生年份为当前年份 
			age = 0;
		}else{ //出生年份大于当前年份
			if (monthMinus < 0) {//出生月份小于当前月份时,还没满周岁
				age = age - 1;
			}
			if (monthMinus == 0) {//当前月份为出生月份时,判断日期
				if (dayMinus < 0) {//出生日期小于当前月份时,没满周岁
				   age = age - 1;
				}
			} 
		}
		return age;
	}

你可能感兴趣的:(java)