Java 根據身份證號獲取年齡、性別、判斷身份證號正確性

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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章