JAVA 身份证号码验证工具(省份、性别、生肖、星座)

[java]  view plain  copy
  1. package com.stt;  
  2.   
  3. import java.text.ParseException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Calendar;  
  6. import java.util.Date;  
  7. import java.util.HashMap;  
  8. import java.util.Map;  
  9.   
  10. import org.apache.commons.lang.StringUtils;  
  11.   
  12. /** 
  13.  * 身份证工具类 
  14.  *  
  15.  * @author June 
  16.  * @version 1.0, 2010-06-17 
  17.  */  
  18. public class CheckIdCardUtils extends StringUtils {  
  19.   
  20.     /** 中国公民身份证号码最小长度。 */  
  21.     public static final int CHINA_ID_MIN_LENGTH = 15;  
  22.   
  23.     /** 中国公民身份证号码最大长度。 */  
  24.     public static final int CHINA_ID_MAX_LENGTH = 18;  
  25.   
  26.     /** 省、直辖市代码表 */  
  27.     public static final String cityCode[] = { "11""12""13""14""15",  
  28.             "21""22""23""31""32""33""34""35""36""37""41",  
  29.             "42""43""44""45""46""50""51""52""53""54""61",  
  30.             "62""63""64""65""71""81""82""91" };  
  31.   
  32.     /** 每位加权因子 */  
  33.     public static final int power[] = { 7910584216379,  
  34.             105842 };  
  35.   
  36.     /** 第18位校检码 */  
  37.     public static final String verifyCode[] = { "1""0""X""9""8""7",  
  38.             "6""5""4""3""2" };  
  39.     /** 最低年限 */  
  40.     public static final int MIN = 1930;  
  41.     public static Map<String, String> cityCodes = new HashMap<String, String>();  
  42.     /** 台湾身份首字母对应数字 */  
  43.     public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();  
  44.     /** 香港身份首字母对应数字 */  
  45.     public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();  
  46.     static {  
  47.         cityCodes.put("11""北京");  
  48.         cityCodes.put("12""天津");  
  49.         cityCodes.put("13""河北");  
  50.         cityCodes.put("14""山西");  
  51.         cityCodes.put("15""内蒙古");  
  52.         cityCodes.put("21""辽宁");  
  53.         cityCodes.put("22""吉林");  
  54.         cityCodes.put("23""黑龙江");  
  55.         cityCodes.put("31""上海");  
  56.         cityCodes.put("32""江苏");  
  57.         cityCodes.put("33""浙江");  
  58.         cityCodes.put("34""安徽");  
  59.         cityCodes.put("35""福建");  
  60.         cityCodes.put("36""江西");  
  61.         cityCodes.put("37""山东");  
  62.         cityCodes.put("41""河南");  
  63.         cityCodes.put("42""湖北");  
  64.         cityCodes.put("43""湖南");  
  65.         cityCodes.put("44""广东");  
  66.         cityCodes.put("45""广西");  
  67.         cityCodes.put("46""海南");  
  68.         cityCodes.put("50""重庆");  
  69.         cityCodes.put("51""四川");  
  70.         cityCodes.put("52""贵州");  
  71.         cityCodes.put("53""云南");  
  72.         cityCodes.put("54""西藏");  
  73.         cityCodes.put("61""陕西");  
  74.         cityCodes.put("62""甘肃");  
  75.         cityCodes.put("63""青海");  
  76.         cityCodes.put("64""宁夏");  
  77.         cityCodes.put("65""新疆");  
  78.         cityCodes.put("71""台湾");  
  79.         cityCodes.put("81""香港");  
  80.         cityCodes.put("82""澳门");  
  81.         cityCodes.put("91""国外");  
  82.         twFirstCode.put("A"10);  
  83.         twFirstCode.put("B"11);  
  84.         twFirstCode.put("C"12);  
  85.         twFirstCode.put("D"13);  
  86.         twFirstCode.put("E"14);  
  87.         twFirstCode.put("F"15);  
  88.         twFirstCode.put("G"16);  
  89.         twFirstCode.put("H"17);  
  90.         twFirstCode.put("J"18);  
  91.         twFirstCode.put("K"19);  
  92.         twFirstCode.put("L"20);  
  93.         twFirstCode.put("M"21);  
  94.         twFirstCode.put("N"22);  
  95.         twFirstCode.put("P"23);  
  96.         twFirstCode.put("Q"24);  
  97.         twFirstCode.put("R"25);  
  98.         twFirstCode.put("S"26);  
  99.         twFirstCode.put("T"27);  
  100.         twFirstCode.put("U"28);  
  101.         twFirstCode.put("V"29);  
  102.         twFirstCode.put("X"30);  
  103.         twFirstCode.put("Y"31);  
  104.         twFirstCode.put("W"32);  
  105.         twFirstCode.put("Z"33);  
  106.         twFirstCode.put("I"34);  
  107.         twFirstCode.put("O"35);  
  108.         hkFirstCode.put("A"1);  
  109.         hkFirstCode.put("B"2);  
  110.         hkFirstCode.put("C"3);  
  111.         hkFirstCode.put("R"18);  
  112.         hkFirstCode.put("U"21);  
  113.         hkFirstCode.put("Z"26);  
  114.         hkFirstCode.put("X"24);  
  115.         hkFirstCode.put("W"23);  
  116.         hkFirstCode.put("O"15);  
  117.         hkFirstCode.put("N"14);  
  118.     }  
  119.   
  120.     /** 
  121.      * 将15位身份证号码转换为18位 
  122.      *  
  123.      * @param idCard 
  124.      *            15位身份编码 
  125.      * @return 18位身份编码 
  126.      */  
  127.     public static String conver15CardTo18(String idCard) {  
  128.         String idCard18 = "";  
  129.         if (idCard.length() != CHINA_ID_MIN_LENGTH) {  
  130.             return null;  
  131.         }  
  132.         if (isNum(idCard)) {  
  133.             // 获取出生年月日  
  134.             String birthday = idCard.substring(612);  
  135.             Date birthDate = null;  
  136.             try {  
  137.                 birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);  
  138.             } catch (ParseException e) {  
  139.                 e.printStackTrace();  
  140.             }  
  141.             Calendar cal = Calendar.getInstance();  
  142.             if (birthDate != null)  
  143.                 cal.setTime(birthDate);  
  144.             // 获取出生年(完全表现形式,如:2010)  
  145.             String sYear = String.valueOf(cal.get(Calendar.YEAR));  
  146.             idCard18 = idCard.substring(06) + sYear + idCard.substring(8);  
  147.             // 转换字符数组  
  148.             char[] cArr = idCard18.toCharArray();  
  149.             if (cArr != null) {  
  150.                 int[] iCard = converCharToInt(cArr);  
  151.                 int iSum17 = getPowerSum(iCard);  
  152.                 // 获取校验位  
  153.                 String sVal = getCheckCode18(iSum17);  
  154.                 if (sVal.length() > 0) {  
  155.                     idCard18 += sVal;  
  156.                 } else {  
  157.                     return null;  
  158.                 }  
  159.             }  
  160.         } else {  
  161.             return null;  
  162.         }  
  163.         return idCard18;  
  164.     }  
  165.   
  166.     /** 
  167.      * 验证身份证是否合法 
  168.      */  
  169.     public static boolean validateCard(String idCard) {  
  170.         String card = idCard.trim();  
  171.         if (validateIdCard18(card)) {  
  172.             return true;  
  173.         }  
  174.         if (validateIdCard15(card)) {  
  175.             return true;  
  176.         }  
  177.         String[] cardval = validateIdCard10(card);  
  178.         if (cardval != null) {  
  179.             if (cardval[2].equals("true")) {  
  180.                 return true;  
  181.             }  
  182.         }  
  183.         return false;  
  184.     }  
  185.   
  186.     /** 
  187.      * 验证18位身份编码是否合法 
  188.      *  
  189.      * @param idCard 
  190.      *            身份编码 
  191.      * @return 是否合法 
  192.      */  
  193.     public static boolean validateIdCard18(String idCard) {  
  194.         boolean bTrue = false;  
  195.         if (idCard.length() == CHINA_ID_MAX_LENGTH) {  
  196.             // 前17位  
  197.             String code17 = idCard.substring(017);  
  198.             // 第18位  
  199.             String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);  
  200.             if (isNum(code17)) {  
  201.                 char[] cArr = code17.toCharArray();  
  202.                 if (cArr != null) {  
  203.                     int[] iCard = converCharToInt(cArr);  
  204.                     int iSum17 = getPowerSum(iCard);  
  205.                     // 获取校验位  
  206.                     String val = getCheckCode18(iSum17);  
  207.                     if (val.length() > 0) {  
  208.                         if (val.equalsIgnoreCase(code18)) {  
  209.                             bTrue = true;  
  210.                         }  
  211.                     }  
  212.                 }  
  213.             }  
  214.         }  
  215.         return bTrue;  
  216.     }  
  217.   
  218.     /** 
  219.      * 验证15位身份编码是否合法 
  220.      *  
  221.      * @param idCard 
  222.      *            身份编码 
  223.      * @return 是否合法 
  224.      */  
  225.     public static boolean validateIdCard15(String idCard) {  
  226.         if (idCard.length() != CHINA_ID_MIN_LENGTH) {  
  227.             return false;  
  228.         }  
  229.         if (isNum(idCard)) {  
  230.             String proCode = idCard.substring(02);  
  231.             if (cityCodes.get(proCode) == null) {  
  232.                 return false;  
  233.             }  
  234.             String birthCode = idCard.substring(612);  
  235.             Date birthDate = null;  
  236.             try {  
  237.                 birthDate = new SimpleDateFormat("yy").parse(birthCode  
  238.                         .substring(02));  
  239.             } catch (ParseException e) {  
  240.                 e.printStackTrace();  
  241.             }  
  242.             Calendar cal = Calendar.getInstance();  
  243.             if (birthDate != null)  
  244.                 cal.setTime(birthDate);  
  245.             if (!valiDate(cal.get(Calendar.YEAR),  
  246.                     Integer.valueOf(birthCode.substring(24)),  
  247.                     Integer.valueOf(birthCode.substring(46)))) {  
  248.                 return false;  
  249.             }  
  250.         } else {  
  251.             return false;  
  252.         }  
  253.         return true;  
  254.     }  
  255.   
  256.     /** 
  257.      * 验证10位身份编码是否合法 
  258.      *  
  259.      * @param idCard 
  260.      *            身份编码 
  261.      * @return 身份证信息数组 
  262.      *         <p> 
  263.      *         [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false) 
  264.      *         若不是身份证件号码则返回null 
  265.      *         </p> 
  266.      */  
  267.     public static String[] validateIdCard10(String idCard) {  
  268.         String[] info = new String[3];  
  269.         String card = idCard.replaceAll("[\\(|\\)]""");  
  270.         if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {  
  271.             return null;  
  272.         }  
  273.         if (idCard.matches("^[a-zA-Z][0-9]{9}{1}")) { // 台湾  
  274.             info[0] = "台湾";  
  275.             System.out.println("11111");  
  276.             String char2 = idCard.substring(12);  
  277.             if (char2.equals("1")) {  
  278.                 info[1] = "M";  
  279.                 System.out.println("MMMMMMM");  
  280.             } else if (char2.equals("2")) {  
  281.                 info[1] = "F";  
  282.                 System.out.println("FFFFFFF");  
  283.             } else {  
  284.                 info[1] = "N";  
  285.                 info[2] = "false";  
  286.                 System.out.println("NNNN");  
  287.                 return info;  
  288.             }  
  289.             info[2] = validateTWCard(idCard) ? "true" : "false";  
  290.         } else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?{1}")) { // 澳门  
  291.             info[0] = "澳门";  
  292.             info[1] = "N";  
  293.             // TODO  
  294.         } else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?{1}")) { // 香港  
  295.             info[0] = "香港";  
  296.             info[1] = "N";  
  297.             info[2] = validateHKCard(idCard) ? "true" : "false";  
  298.         } else {  
  299.             return null;  
  300.         }  
  301.         return info;  
  302.     }  
  303.   
  304.     /** 
  305.      * 验证台湾身份证号码 
  306.      *  
  307.      * @param idCard 
  308.      *            身份证号码 
  309.      * @return 验证码是否符合 
  310.      */  
  311.     public static boolean validateTWCard(String idCard) {  
  312.         String start = idCard.substring(01);  
  313.         String mid = idCard.substring(19);  
  314.         String end = idCard.substring(910);  
  315.         Integer iStart = twFirstCode.get(start);  
  316.         Integer sum = iStart / 10 + (iStart % 10) * 9;  
  317.         char[] chars = mid.toCharArray();  
  318.         Integer iflag = 8;  
  319.         for (char c : chars) {  
  320.             sum = sum + Integer.valueOf(c + "") * iflag;  
  321.             iflag--;  
  322.         }  
  323.         return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true  
  324.                 : false;  
  325.     }  
  326.   
  327.     /** 
  328.      * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查) 
  329.      * <p> 
  330.      * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35 
  331.      * 最后一位校验码为0-9的数字加上字符"A","A"代表10 
  332.      * </p> 
  333.      * <p> 
  334.      * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效 
  335.      * </p> 
  336.      *  
  337.      * @param idCard 
  338.      *            身份证号码 
  339.      * @return 验证码是否符合 
  340.      */  
  341.     public static boolean validateHKCard(String idCard) {  
  342.         String card = idCard.replaceAll("[\\(|\\)]""");  
  343.         Integer sum = 0;  
  344.         if (card.length() == 9) {  
  345.             sum = (Integer.valueOf(card.substring(01).toUpperCase()  
  346.                     .toCharArray()[0]) - 55)  
  347.                     * 9  
  348.                     + (Integer.valueOf(card.substring(12).toUpperCase()  
  349.                             .toCharArray()[0]) - 55) * 8;  
  350.             card = card.substring(19);  
  351.         } else {  
  352.             sum = 522 + (Integer.valueOf(card.substring(01).toUpperCase()  
  353.                     .toCharArray()[0]) - 55) * 8;  
  354.         }  
  355.         String mid = card.substring(17);  
  356.         String end = card.substring(78);  
  357.         char[] chars = mid.toCharArray();  
  358.         Integer iflag = 7;  
  359.         for (char c : chars) {  
  360.             sum = sum + Integer.valueOf(c + "") * iflag;  
  361.             iflag--;  
  362.         }  
  363.         if (end.toUpperCase().equals("A")) {  
  364.             sum = sum + 10;  
  365.         } else {  
  366.             sum = sum + Integer.valueOf(end);  
  367.         }  
  368.         return (sum % 11 == 0) ? true : false;  
  369.     }  
  370.   
  371.     /** 
  372.      * 将字符数组转换成数字数组 
  373.      *  
  374.      * @param ca 
  375.      *            字符数组 
  376.      * @return 数字数组 
  377.      */  
  378.     public static int[] converCharToInt(char[] ca) {  
  379.         int len = ca.length;  
  380.         int[] iArr = new int[len];  
  381.         try {  
  382.             for (int i = 0; i < len; i++) {  
  383.                 iArr[i] = Integer.parseInt(String.valueOf(ca[i]));  
  384.             }  
  385.         } catch (NumberFormatException e) {  
  386.             e.printStackTrace();  
  387.         }  
  388.         return iArr;  
  389.     }  
  390.   
  391.     /** 
  392.      * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 
  393.      *  
  394.      * @param iArr 
  395.      * @return 身份证编码。 
  396.      */  
  397.     public static int getPowerSum(int[] iArr) {  
  398.         int iSum = 0;  
  399.         if (power.length == iArr.length) {  
  400.             for (int i = 0; i < iArr.length; i++) {  
  401.                 for (int j = 0; j < power.length; j++) {  
  402.                     if (i == j) {  
  403.                         iSum = iSum + iArr[i] * power[j];  
  404.                     }  
  405.                 }  
  406.             }  
  407.         }  
  408.         return iSum;  
  409.     }  
  410.   
  411.     /** 
  412.      * 将power和值与11取模获得余数进行校验码判断 
  413.      *  
  414.      * @param iSum 
  415.      * @return 校验位 
  416.      */  
  417.     public static String getCheckCode18(int iSum) {  
  418.         String sCode = "";  
  419.         switch (iSum % 11) {  
  420.         case 10:  
  421.             sCode = "2";  
  422.             break;  
  423.         case 9:  
  424.             sCode = "3";  
  425.             break;  
  426.         case 8:  
  427.             sCode = "4";  
  428.             break;  
  429.         case 7:  
  430.             sCode = "5";  
  431.             break;  
  432.         case 6:  
  433.             sCode = "6";  
  434.             break;  
  435.         case 5:  
  436.             sCode = "7";  
  437.             break;  
  438.         case 4:  
  439.             sCode = "8";  
  440.             break;  
  441.         case 3:  
  442.             sCode = "9";  
  443.             break;  
  444.         case 2:  
  445.             sCode = "x";  
  446.             break;  
  447.         case 1:  
  448.             sCode = "0";  
  449.             break;  
  450.         case 0:  
  451.             sCode = "1";  
  452.             break;  
  453.         }  
  454.         return sCode;  
  455.     }  
  456.   
  457.     /** 
  458.      * 根据身份编号获取年龄 
  459.      *  
  460.      * @param idCard 
  461.      *            身份编号 
  462.      * @return 年龄 
  463.      */  
  464.     public static int getAgeByIdCard(String idCard) {  
  465.         int iAge = 0;  
  466.         if (idCard.length() == CHINA_ID_MIN_LENGTH) {  
  467.             idCard = conver15CardTo18(idCard);  
  468.         }  
  469.         String year = idCard.substring(610);  
  470.         Calendar cal = Calendar.getInstance();  
  471.         int iCurrYear = cal.get(Calendar.YEAR);  
  472.         iAge = iCurrYear - Integer.valueOf(year);  
  473.         return iAge;  
  474.     }  
  475.   
  476.     /** 
  477.      * 根据身份编号获取生日 
  478.      *  
  479.      * @param idCard 
  480.      *            身份编号 
  481.      * @return 生日(yyyyMMdd) 
  482.      */  
  483.     public static String getBirthByIdCard(String idCard) {  
  484.         Integer len = idCard.length();  
  485.         if (len < CHINA_ID_MIN_LENGTH) {  
  486.             return null;  
  487.         } else if (len == CHINA_ID_MIN_LENGTH) {  
  488.             idCard = conver15CardTo18(idCard);  
  489.         }  
  490.         return idCard.substring(614);  
  491.     }  
  492.   
  493.     /** 
  494.      * 根据身份编号获取生日年 
  495.      *  
  496.      * @param idCard 
  497.      *            身份编号 
  498.      * @return 生日(yyyy) 
  499.      */  
  500.     public static Short getYearByIdCard(String idCard) {  
  501.         Integer len = idCard.length();  
  502.         if (len < CHINA_ID_MIN_LENGTH) {  
  503.             return null;  
  504.         } else if (len == CHINA_ID_MIN_LENGTH) {  
  505.             idCard = conver15CardTo18(idCard);  
  506.         }  
  507.         return Short.valueOf(idCard.substring(610));  
  508.     }  
  509.   
  510.     /** 
  511.      * 根据身份编号获取生日月 
  512.      *  
  513.      * @param idCard 
  514.      *            身份编号 
  515.      * @return 生日(MM) 
  516.      */  
  517.     public static Short getMonthByIdCard(String idCard) {  
  518.         Integer len = idCard.length();  
  519.         if (len < CHINA_ID_MIN_LENGTH) {  
  520.             return null;  
  521.         } else if (len == CHINA_ID_MIN_LENGTH) {  
  522.             idCard = conver15CardTo18(idCard);  
  523.         }  
  524.         return Short.valueOf(idCard.substring(1012));  
  525.     }  
  526.   
  527.     /** 
  528.      * 根据身份编号获取生日天 
  529.      *  
  530.      * @param idCard 
  531.      *            身份编号 
  532.      * @return 生日(dd) 
  533.      */  
  534.     public static Short getDateByIdCard(String idCard) {  
  535.         Integer len = idCard.length();  
  536.         if (len < CHINA_ID_MIN_LENGTH) {  
  537.             return null;  
  538.         } else if (len == CHINA_ID_MIN_LENGTH) {  
  539.             idCard = conver15CardTo18(idCard);  
  540.         }  
  541.         return Short.valueOf(idCard.substring(1214));  
  542.     }  
  543.   
  544.     /** 
  545.      * 根据身份编号获取性别 
  546.      *  
  547.      * @param idCard 
  548.      *            身份编号 
  549.      * @return 性别(M-男,F-女,N-未知) 
  550.      */  
  551.     public static String getGenderByIdCard(String idCard) {  
  552.         String sGender = "N";  
  553.         if (idCard.length() == CHINA_ID_MIN_LENGTH) {  
  554.             idCard = conver15CardTo18(idCard);  
  555.         }  
  556.         String sCardNum = idCard.substring(1617);  
  557.         if (Integer.parseInt(sCardNum) % 2 != 0) {  
  558.             sGender = "M";  
  559.         } else {  
  560.             sGender = "F";  
  561.         }  
  562.         return sGender;  
  563.     }  
  564.   
  565.     /** 
  566.      * 根据身份编号获取户籍省份 
  567.      *  
  568.      * @param idCard 
  569.      *            身份编码 
  570.      * @return 省级编码。 
  571.      */  
  572.     public static String getProvinceByIdCard(String idCard) {  
  573.         int len = idCard.length();  
  574.         String sProvince = null;  
  575.         String sProvinNum = "";  
  576.         if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {  
  577.             sProvinNum = idCard.substring(02);  
  578.         }  
  579.         sProvince = cityCodes.get(sProvinNum);  
  580.         return sProvince;  
  581.     }  
  582.   
  583.     /** 
  584.      * 数字验证 
  585.      *  
  586.      * @param val 
  587.      * @return 提取的数字。 
  588.      */  
  589.     public static boolean isNum(String val) {  
  590.         return val == null || "".equals(val) ? false : val  
  591.                 .matches("^[0-9]*{1}");  
  592.     }  
  593.   
  594.     /** 
  595.      * 验证小于当前日期 是否有效 
  596.      *  
  597.      * @param iYear 
  598.      *            待验证日期(年) 
  599.      * @param iMonth 
  600.      *            待验证日期(月 1-12) 
  601.      * @param iDate 
  602.      *            待验证日期(日) 
  603.      * @return 是否有效 
  604.      */  
  605.     public static boolean valiDate(int iYear, int iMonth, int iDate) {  
  606.         Calendar cal = Calendar.getInstance();  
  607.         int year = cal.get(Calendar.YEAR);  
  608.         int datePerMonth;  
  609.         if (iYear < MIN || iYear >= year) {  
  610.             return false;  
  611.         }  
  612.         if (iMonth < 1 || iMonth > 12) {  
  613.             return false;  
  614.         }  
  615.         switch (iMonth) {  
  616.         case 4:  
  617.         case 6:  
  618.         case 9:  
  619.         case 11:  
  620.             datePerMonth = 30;  
  621.             break;  
  622.         case 2:  
  623.             boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0))  
  624.                     && (iYear > MIN && iYear < year);  
  625.             datePerMonth = dm ? 29 : 28;  
  626.             break;  
  627.         default:  
  628.             datePerMonth = 31;  
  629.         }  
  630.         return (iDate >= 1) && (iDate <= datePerMonth);  
  631.     }  
  632.   
  633.   
  634.     /** 
  635.      *根据身份证号,自动获取对应的星座 
  636.      *  
  637.      * @param idCard 
  638.      *            身份证号码 
  639.      * @return 星座 
  640.      */  
  641.     public static String getConstellationById(String idCard) {  
  642.         if (!validateCard(idCard))  
  643.             return "";  
  644.         int month = CheckIdCardUtils.getMonthByIdCard(idCard);  
  645.         int day = CheckIdCardUtils.getDateByIdCard(idCard);  
  646.         String strValue = "";  
  647.   
  648.         if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) {  
  649.             strValue = "水瓶座";  
  650.         } else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) {  
  651.             strValue = "双鱼座";  
  652.         } else if ((month == 3 && day > 20) || (month == 4 && day <= 19)) {  
  653.             strValue = "白羊座";  
  654.         } else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) {  
  655.             strValue = "金牛座";  
  656.         } else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) {  
  657.             strValue = "双子座";  
  658.         } else if ((month == 6 && day > 21) || (month == 7 && day <= 22)) {  
  659.             strValue = "巨蟹座";  
  660.         } else if ((month == 7 && day > 22) || (month == 8 && day <= 22)) {  
  661.             strValue = "狮子座";  
  662.         } else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) {  
  663.             strValue = "处女座";  
  664.         } else if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) {  
  665.             strValue = "天秤座";  
  666.         } else if ((month == 10 && day > 23) || (month == 11 && day <= 22)) {  
  667.             strValue = "天蝎座";  
  668.         } else if ((month == 11 && day > 22) || (month == 12 && day <= 21)) {  
  669.             strValue = "射手座";  
  670.         } else if ((month == 12 && day > 21) || (month == 1 && day <= 19)) {  
  671.             strValue = "魔羯座";  
  672.         }  
  673.   
  674.         return strValue;  
  675.     }  
  676.       
  677.       
  678.     /** 
  679.      *根据身份证号,自动获取对应的生肖 
  680.      *  
  681.      * @param idCard 
  682.      *            身份证号码 
  683.      * @return 生肖 
  684.      */  
  685.     public static String getZodiacById(String idCard) { // 根据身份证号,自动返回对应的生肖  
  686.         if (!validateCard(idCard))  
  687.             return "";  
  688.   
  689.         String sSX[] = { "猪""鼠""牛""虎""兔""龙""蛇""马""羊""猴""鸡""狗" };  
  690.         int year = CheckIdCardUtils.getYearByIdCard(idCard);  
  691.         int end = 3;  
  692.         int x = (year - end) % 12;  
  693.   
  694.         String retValue = "";  
  695.         retValue = sSX[x];  
  696.   
  697.         return retValue;  
  698.     }  
  699.       
  700.       
  701.     /** 
  702.      *根据身份证号,自动获取对应的天干地支 
  703.      *  
  704.      * @param idCard 
  705.      *            身份证号码 
  706.      * @return 天干地支 
  707.      */  
  708.     public static String getChineseEraById(String idCard) { // 根据身份证号,自动返回对应的生肖  
  709.         if (!validateCard(idCard))  
  710.             return "";  
  711.   
  712.         String sTG[] = { "癸""甲""乙""丙""丁""戊""己""庚""辛""任" };  
  713.         String sDZ[] = { "亥""子""丑""寅""卯""辰""巳""午""未""申""酉""戌" };  
  714.   
  715.         int year = CheckIdCardUtils.getYearByIdCard(idCard);  
  716.         int i = (year - 3) % 10;  
  717.         int j = (year - 3) % 12;  
  718.   
  719.         String retValue = "";  
  720.         retValue = sTG[i] + sDZ[j];  
  721.   
  722.         return retValue;  
  723.     }  
  724.       
  725.       
  726.     public static void main(String[] args) {  
  727.         String idCard = "";  
  728.         System.out.println(CheckIdCardUtils.getGenderByIdCard(idCard));  
  729.         System.out.println(CheckIdCardUtils.getBirthByIdCard(idCard));  
  730.         System.out.println(CheckIdCardUtils.getMonthByIdCard(idCard));  
  731.         System.out.println(CheckIdCardUtils.getDateByIdCard(idCard));  
  732.         System.out.println(CheckIdCardUtils.getConstellationById(idCard));  
  733.         System.out.println(CheckIdCardUtils.getZodiacById(idCard));  
  734.         System.out.println(CheckIdCardUtils.getChineseEraById(idCard));  
  735.         System.out.println(CheckIdCardUtils.getProvinceByIdCard(idCard));  
  736.     }  
  737. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值