已遷址

          已遷址http://www.cnblogs.com/live365wang/

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            28 隨筆 :: 0 文章 :: 1 評(píng)論 :: 0 Trackbacks
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          package com.tg.user.controller;

          import java.text.SimpleDateFormat;
          import java.util.Calendar;
          import java.util.GregorianCalendar;
          import java.util.Hashtable;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;

          import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

          public class IDCard {
              
          /*********************************** 身份證驗(yàn)證開始 ****************************************/
              
          /**
               * 身份證號(hào)碼驗(yàn)證 1、號(hào)碼的結(jié)構(gòu) 公民身份號(hào)碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗(yàn)碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,
               * 八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。 2、地址碼(前六位數(shù))
               * 表示編碼對(duì)象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。 3、出生日期碼(第七位至十四位)
               * 表示編碼對(duì)象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。 4、順序碼(第十五位至十七位)
               * 表示在同一地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年、同月、同日出生的人編定的順序號(hào), 順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。 5、校驗(yàn)碼(第十八位數(shù))
               * (1)十七位數(shù)字本體碼加權(quán)求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先對(duì)前17位數(shù)字的權(quán)求和
               * Ai:表示第i位置上的身份證號(hào)碼數(shù)字值 Wi:表示第i位置上的加權(quán)因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
               * (2)計(jì)算模 Y = mod(S, 11) (3)通過模得到對(duì)應(yīng)的校驗(yàn)碼 Y: 0 1 2 3 4 5 6 7 8 9 10 校驗(yàn)碼: 1 0 X 9 8 7 6 5 4 3 2
               
          */

              
          /**
               * 功能:身份證的有效驗(yàn)證
               * 
               * 
          @param IDStr
               *            身份證號(hào)
               * 
          @return 有效:返回"" 無效:返回String信息
               * 
          @throws ParseException
               
          */
              @SuppressWarnings(
          "unchecked")
              
          public static String IDCardValidate(String IDStr) throws ParseException {
                  String errorInfo 
          = "";// 記錄錯(cuò)誤信息
                  String[] ValCodeArr = { "1""0""x""9""8""7""6""5""4",
                          
          "3""2" };
                  String[] Wi 
          = { "7""9""10""5""8""4""2""1""6""3""7",
                          
          "9""10""5""8""4""2" };
                  String Ai 
          = "";
                  
          // ================ 號(hào)碼的長(zhǎng)度 15位或18位 ================
                  if (IDStr.length() != 15 && IDStr.length() != 18) {
                      errorInfo 
          = "身份證號(hào)碼長(zhǎng)度應(yīng)該為15位或18位。";
                      
          return errorInfo;
                  }
                  
          // =======================(end)========================

                  
          // ================ 數(shù)字 除最后以為都為數(shù)字 ================
                  if (IDStr.length() == 18) {
                      Ai 
          = IDStr.substring(017);
                  } 
          else if (IDStr.length() == 15) {
                      Ai 
          = IDStr.substring(06+ "19" + IDStr.substring(615);
                  }
                  
          if (isNumeric(Ai) == false) {
                      errorInfo 
          = "身份證15位號(hào)碼都應(yīng)為數(shù)字 ; 18位號(hào)碼除最后一位外,都應(yīng)為數(shù)字。";
                      
          return errorInfo;
                  }
                  
          // =======================(end)========================

                  
          // ================ 出生年月是否有效 ================
                  String strYear = Ai.substring(610);// 年份
                  String strMonth = Ai.substring(1012);// 月份
                  String strDay = Ai.substring(1214);// 月份
                  if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
                      errorInfo 
          = "身份證生日無效。";
                      
          return errorInfo;
                  }
                  GregorianCalendar gc 
          = new GregorianCalendar();
                  SimpleDateFormat s 
          = new SimpleDateFormat("yyyy-MM-dd");
                  
          try {
                      
          if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
                              
          || (gc.getTime().getTime() - s.parse(
                                      strYear 
          + "-" + strMonth + "-" + strDay).getTime()) < 0) {
                          errorInfo 
          = "身份證生日不在有效范圍。";
                          
          return errorInfo;
                      }
                  } 
          catch (NumberFormatException e) {
                      e.printStackTrace();
                  } 
          catch (java.text.ParseException e) {
                      e.printStackTrace();
                  }
                  
          if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
                      errorInfo 
          = "身份證月份無效";
                      
          return errorInfo;
                  }
                  
          if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
                      errorInfo 
          = "身份證日期無效";
                      
          return errorInfo;
                  }
                  
          // =====================(end)=====================

                  
          // ================ 地區(qū)碼時(shí)候有效 ================
                  Hashtable h = GetAreaCode();
                  
          if (h.get(Ai.substring(02)) == null) {
                      errorInfo 
          = "身份證地區(qū)編碼錯(cuò)誤。";
                      
          return errorInfo;
                  }
                  
          // ==============================================

                  
          // ================ 判斷最后一位的值 ================
                  int TotalmulAiWi = 0;
                  
          for (int i = 0; i < 17; i++) {
                      TotalmulAiWi 
          = TotalmulAiWi
                              
          + Integer.parseInt(String.valueOf(Ai.charAt(i)))
                              
          * Integer.parseInt(Wi[i]);
                  }
                  
          int modValue = TotalmulAiWi % 11;
                  String strVerifyCode 
          = ValCodeArr[modValue];
                  Ai 
          = Ai + strVerifyCode;

                  
          if (IDStr.length() == 18) {
                      
          if (Ai.equals(IDStr) == false) {
                          errorInfo 
          = "身份證無效,不是合法的身份證號(hào)碼";
                          
          return errorInfo;
                      }
                  } 
          else {
                      
          return "";
                  }
                  
          // =====================(end)=====================
                  return "";
              }

              
          /**
               * 功能:設(shè)置地區(qū)編碼
               * 
               * 
          @return Hashtable 對(duì)象
               
          */
              @SuppressWarnings(
          "unchecked")
              
          private static Hashtable GetAreaCode() {
                  Hashtable hashtable 
          = new Hashtable();
                  hashtable.put(
          "11""北京");
                  hashtable.put(
          "12""天津");
                  hashtable.put(
          "13""河北");
                  hashtable.put(
          "14""山西");
                  hashtable.put(
          "15""內(nèi)蒙古");
                  hashtable.put(
          "21""遼寧");
                  hashtable.put(
          "22""吉林");
                  hashtable.put(
          "23""黑龍江");
                  hashtable.put(
          "31""上海");
                  hashtable.put(
          "32""江蘇");
                  hashtable.put(
          "33""浙江");
                  hashtable.put(
          "34""安徽");
                  hashtable.put(
          "35""福建");
                  hashtable.put(
          "36""江西");
                  hashtable.put(
          "37""山東");
                  hashtable.put(
          "41""河南");
                  hashtable.put(
          "42""湖北");
                  hashtable.put(
          "43""湖南");
                  hashtable.put(
          "44""廣東");
                  hashtable.put(
          "45""廣西");
                  hashtable.put(
          "46""海南");
                  hashtable.put(
          "50""重慶");
                  hashtable.put(
          "51""四川");
                  hashtable.put(
          "52""貴州");
                  hashtable.put(
          "53""云南");
                  hashtable.put(
          "54""西藏");
                  hashtable.put(
          "61""陜西");
                  hashtable.put(
          "62""甘肅");
                  hashtable.put(
          "63""青海");
                  hashtable.put(
          "64""寧夏");
                  hashtable.put(
          "65""新疆");
                  hashtable.put(
          "71""臺(tái)灣");
                  hashtable.put(
          "81""香港");
                  hashtable.put(
          "82""澳門");
                  hashtable.put(
          "91""國(guó)外");
                  
          return hashtable;
              }

              
          /**
               * 功能:判斷字符串是否為數(shù)字
               * 
               * 
          @param str
               * 
          @return
               
          */
              
          private static boolean isNumeric(String str) {
                  Pattern pattern 
          = Pattern.compile("[0-9]*");
                  Matcher isNum 
          = pattern.matcher(str);
                  
          if (isNum.matches()) {
                      
          return true;
                  } 
          else {
                      
          return false;
                  }
              }

              
          /**
               * 功能:判斷字符串是否為日期格式
               * 
               * 
          @param str
               * 
          @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]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");
                  Matcher m 
          = pattern.matcher(strDate);
                  
          if (m.matches()) {
                      
          return true;
                  } 
          else {
                      
          return false;
                  }
              }

              
          /**
               * 
          @param args
               * 
          @throws ParseException
               
          */
              @SuppressWarnings(
          "static-access")
              
          public static void main(String[] args) throws ParseException {
                  
          // String IDCardNum="210102820826411";
                  
          // String IDCardNum="210102198208264114";
                  String IDCardNum = "210181198807193116";
                  IDCard cc 
          = new IDCard();
                  System.out.println(cc.IDCardValidate(IDCardNum));
                  
          // System.out.println(cc.isDate("1996-02-29"));
              }
              
          /*********************************** 身份證驗(yàn)證結(jié)束 ****************************************/

          }
          posted on 2011-02-23 09:03 已遷址 閱讀(322) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 安丘市| 葫芦岛市| 根河市| 四子王旗| 图们市| 镇平县| 汉中市| 新巴尔虎左旗| 台南市| 瑞昌市| 巴南区| 和田县| 北票市| 政和县| 沛县| 望江县| 静安区| 扬中市| 张北县| 黔西| 兰坪| 双峰县| 呼和浩特市| 郑州市| 阿坝| 新乡市| 扶余县| 罗定市| 怀来县| 洛扎县| 南平市| 汉中市| 二连浩特市| 五寨县| 菏泽市| 临邑县| 西昌市| 疏附县| 承德市| 青冈县| 桐乡市|