一、根据身份证号获取年龄、判断性别
工具方法:
/**
* 根据身份证号(18位和15位通用)计算年龄——默认与当前系统时间对比
* @param idCard 身份证号
* @return
*/
public static Integer getPersonAgeFromIdCard1(String idCard) {
Integer age = 0;
//若身份证是15位则需要转换
if(idCard.length() == 15){
StringBuilder s = new StringBuilder();
s.append(idCard.substring(0,6)).append("19").append(idCard.substring(6));
idCard = s.toString();
}
try {
//截取身份证中出行人出生日期中的年、月、日
Integer personYear = Integer.parseInt(idCard.substring(6, 10));
Integer personMonth = Integer.parseInt(idCard.substring(10, 12));
Integer personDay = Integer.parseInt(idCard.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;
age = yearMinus; //先大致赋值
if (yearMinus == 0) { //出生年份为当前年份
age = 0;
}else{ //出生年份大于当前年份
if (monthMinus < 0) {//出生月份小于当前月份时,还没满周岁
age = age - 1;
}
if (monthMinus == 0) {//当前月份为出生月份时,判断日期
if (dayMinus < 0) {//出生日期小于当前月份时,没满周岁
age = age - 1;
}
}
}
}catch (Exception e){
e.printStackTrace();
System.out.println("身份证信息有误:" + idCard);
}finally {
return age;
}
}
/**
* 根据身份证号(18位和15位通用)计算年龄——通过与指定时间对比
* @param idCard 身份证号
* @param date 指定的时间
* @return
*/
public static Integer getPersonAgeFromIdCard2(String idCard, Date date) {
Integer age = 0;
try {
//若身份证是15位则需要转换
if(idCard.length() == 15){
StringBuilder s = new StringBuilder();
s.append(idCard.substring(0,6)).append("19").append(idCard.substring(6));
idCard = s.toString();
}
//截取身份证中出行人出生日期中的年、月、日
Integer personYear = Integer.parseInt(idCard.substring(6, 10));
Integer personMonth = Integer.parseInt(idCard.substring(10, 12));
Integer personDay = Integer.parseInt(idCard.substring(12, 14));
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 得到当前时间的年、月、日
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;
age = yearMinus; //先大致赋值
if (yearMinus == 0) { //出生年份为当前年份
age = 0;
}else{ //出生年份大于当前年份
if (monthMinus < 0) {//出生月份小于当前月份时,还没满周岁
age = age - 1;
}
if (monthMinus == 0) {//当前月份为出生月份时,判断日期
if (dayMinus < 0) {//出生日期小于当前月份时,没满周岁
age = age - 1;
}
}
}
}catch (Exception e){
e.printStackTrace();
System.out.println("身份证信息有误:" + idCard);
}finally {
return age;
}
}
/**
* 判断身份证号是否由“0,1,2,3,4,5,6,7,8,9,X”组成
* @param idCard 身份证号
* @return
*/
public static boolean judgeIdCard(String idCard){
Integer len = idCard.length();
char[] c = idCard.toCharArray();
if ( len != 15 && len != 18){
System.out.println("身份证应该是15位或者18位");
return false;
}
for(int i = 0 ; i < c.length ; i++){
if(c[i] < '0' || c[i] > '9'){
if((i + 1) == 18 && c[i] == 'X'){
continue;
}else{
return false;
}
}
}
return true;
}
/**
* 根据身份证号(18位和15位通用)获取性别
* @param idCard 身份证号
* @return
*/
public static String getGenderByIdCard(String idCard){
Integer genderInt ;
if(idCard.length() == 18){
//如果身份证号18位,取身份证号倒数第二位
char c = idCard.charAt(idCard.length() - 2);
genderInt = Integer.parseInt(String.valueOf(c));
}else{
//如果身份证号15位,取身份证号最后一位
char c = idCard.charAt(idCard.length() - 1);
genderInt = Integer.parseInt(String.valueOf(c));
}
if(genderInt % 2 == 1){
//余数为1(即奇数),则伟男性
return "男";
}else{
//余数为0(即偶数),则为女性
return "女";
}
}
main方法:
public static void main(String[] args) throws ParseException {
System.out.println("***************18位身份证*******************");
//根据身份证号计算年龄——默认与当前系统时间对比
String idCard1 = "11010119730307383X";
Integer age1_1 = getPersonAgeFromIdCard1(idCard1);
System.out.println("根据18位身份证号("+ idCard1 +")计算年龄——默认与当前系统时间对比:" + age1_1);
//根据身份证号计算年龄——通过与指定时间对比
Date date= new SimpleDateFormat("yyyy-MM-dd").parse("2000-02-12");
Integer age1_2 = getPersonAgeFromIdCard2(idCard1, date);
System.out.println("根据18位身份证号("+ idCard1 +")计算年龄——默认与指定时间(2000-02-12)对比:" + age1_2);
System.out.println("根据18位身份证号("+ idCard1 +")判断性别——性别为:" + getGenderByIdCard(idCard1));
System.out.println("***************15位身份证*******************");
//根据身份证号计算年龄——默认与当前系统时间对比
String idCard2 = "320311770706002";
Integer age2_1 = getPersonAgeFromIdCard1(idCard2);
System.out.println("根据15位身份证号("+ idCard2 +")计算年龄——默认与当前系统时间对比:" + age2_1);
//根据身份证号计算年龄——通过与指定时间对比
Integer age2_2 = getPersonAgeFromIdCard2(idCard2, date);
System.out.println("根据15位身份证号("+ idCard2 +")计算年龄——默认与指定时间(2000-02-12)对比:" + age2_2);
System.out.println("根据15位身份证号("+ idCard2 +")判断性别——性别为:" + getGenderByIdCard(idCard2));
}
运行结果: