import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import com.suxsoft.esclient.pojo.Ret;
public class IdCardManageUtil {
final int[] Weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,
1 }; // 加权因子
final String[] Verifycode = { "1", "0", "X", "9", "8", "7", "6", "5", "4",
"3", "2" }; // 校验码
/**
* 判断身份证号码有效性
*
* @param idCard
* 身份证号码
* @return 校验结果 0表示无效,1表示有效
*/
public Ret checkIdCard(String idCard) {
String newIdCard = idCard;
Ret ret = new Ret();
if (idCard.length() != 15 && idCard.length() != 18) {
ret.setCode(OS.FAILED);
ret.setMsg("身份证位数必须是15位或者18位!");
} else {
if (idCard.length() == 15) { // 如果是15位,转换为18位
Long m = Long.parseLong(idCard.substring(8, 10));
Long d = Long.parseLong(idCard.substring(10, 12));
if (m > 12 || d > 31) {
ret.setCode(OS.FAILED);
ret.setMsg("身份证无效!");
} else {
newIdCard = proIdCard15to18(idCard);
if (newIdCard.length() != 18) { // 位数不对,返回0
ret.setCode(OS.FAILED);
ret.setMsg("身份证无效!");
} else {
String verify = newIdCard.substring(17, 18);
if (verify.equals(getVerify(newIdCard))) { // 检查有效性,并返回检查结果
ret.setCode(OS.SUCCESS);// 有效,返回
} else {
ret.setCode(OS.FAILED);
ret.setMsg("身份证无效!"); // 无效,返回0
}
}
}
} else if (idCard.length() == 18) {
String verify = newIdCard.substring(17, 18);
if (verify.equals(getVerify(newIdCard))) { // 检查有效性,并返回检查结果
ret.setCode(OS.SUCCESS);// 有效,返回
} else {
ret.setCode(OS.FAILED);
ret.setMsg("身份证无效!"); // 无效,返回0
}
}
}
return ret;
}
/**
* 获取正确的身份证
*
* @param idCard
* @return
*/
public String getAae135(String idCard) {
String newIdCard = null;
if (idCard.length() == 15) {
newIdCard = proIdCard15to18(idCard);
}
if (idCard.length() == 18) {
newIdCard = idCard;
}
return newIdCard;
}
/**
* 从身份证号码中获取性别
*
* @param idCard
* 身份证号码
* @return 性别,'F'为女性,'M'为男性
*/
public String getSexFromIdCard(String idCard) {
if (idCard.length() == 15) { // 如果是15位,转换为18位
idCard = proIdCard15to18(idCard);
}
int a = Integer.parseInt(idCard.substring(16, 17)); // 取倒数第2位
if (a % 2 == 0) { // 偶数为女性,基数为男性
return "2";
} else {
return "1";
}
}
/**
* 从身份证号码中获取出生日期
*
* @param idCard
* 身份证号码
* @return 出生日期
*/
public String getBirthdayFromIdCard(String idCard) {
if (idCard.length() == 15) { // 如果是15位,转换为18位
idCard = proIdCard15to18(idCard);
}
String birthday = idCard.substring(6, 14); // 获取表示出生日期的第7-14位
return birthday.substring(0, 4) + "-" + birthday.substring(4, 6) + "-"
+ birthday.substring(6, 8);
}
/**
* 15位身份证号码转换为18位
*
* @param idCard
* 15位身份证号码
* @return newidCard 扩充后的18位身份证号码
*/
public String proIdCard15to18(String idCard) {
int i, j, s = 0;
String newidCard;
newidCard = idCard;
newidCard = newidCard.substring(0, 6) + "19"
+ newidCard.substring(6, idCard.length());
for (i = 0; i < newidCard.length(); i++) {
j = Integer.parseInt(newidCard.substring(i, i + 1)) * Weight[i];
s = s + j;
}
s = s % 11;
newidCard = newidCard + Verifycode[s];
return newidCard;
}
/**
* 获取身份证校验码
*
* @param idCard
* 身份证号码
* @return 身份证号码的校验码
*/
private String getVerify(String idCard) {
int[] ai = new int[18];
int remaining = 0;
if (idCard.length() == 18) {
idCard = idCard.substring(0, 17);
}
if (idCard.length() == 17) {
int sum = 0;
for (int i = 0; i < 17; i++) {
String k = idCard.substring(i, i + 1);
ai[i] = Integer.parseInt(k);
}
for (int i = 0; i < 17; i++) {
sum = sum + Weight[i] * ai[i];
}
remaining = sum % 11;
}
return remaining == 2 ? "X" : String.valueOf(Verifycode[remaining]);
}
/**
* 传入身份证编号,返回身份证是否合法,如果为true则合法,如果为false则验证未通过
*
* @param idCard
* @return {
* @code String aac002 =
* this.getPageElement("aac002").getValue();//获取页面输入的身份证编号 boolean
* flag = IdCardManageUtil.trueOrFalseIdCard(aac002);//判断身份证编号是否能够验证通过
* if(flag){ ... }else{ throw new RadowException("身份证不合法!"); } }
*/
public static boolean trueOrFalseIdCard(String idCard) {
// 如果为空 验证不通过
if (idCard == null || idCard.equals("")) {
return false;
}
idCard = idCard.toUpperCase();
// 如果不为空 且验证通过则返回true 否则返回false
Ret ret = new Ret();
try {
ret = new IdCardManageUtil().checkIdCard(idCard);
} catch (Exception e) {
// e.printStackTrace();
return false;
}
if (OS.SUCCESS.equals(ret.getCode())) {
return true;
} else {
return false;
}
}
/**
* 获取年龄
*
* @param aac002
* @return
*/
public int getAge(String aac002) {
String birth = aac002.substring(6, 14);
// dayOfBirth出生那一日的时间
java.util.Date dayOfBirth = null;
try {
dayOfBirth = new SimpleDateFormat("yyyyMMdd").parse(birth);
} catch (Exception e) {
// TODO: handle exception
}
java.util.Calendar cal = new GregorianCalendar();// 当前时间
int year = cal.get(Calendar.YEAR);// year今年年份
cal.setTime(dayOfBirth);// 当前cal为dayOfBirth出生那一日的Calendar时间
int birthYear = cal.get(Calendar.YEAR);// 出生年份
int age = year - birthYear;
cal.set(Calendar.YEAR, year);// 计算今年生日
Date birthday = cal.getTime();// birthday 每年的生日
System.out.println(birthday);
Date today = new Date();// today 今天
System.out.println(today);
if (today.compareTo(birthday) < 0) {// 当前时间小于今年的生日
// 今年没有过生日, 减一岁
age--;
}
return age;
}
}