鷹翔宇空

          學(xué)習(xí)和生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          這兩天做一個(gè)身份證校驗(yàn)的問(wèn)題,碰到了日期校驗(yàn)的問(wèn)題,為了搞的簡(jiǎn)單一點(diǎn),查了很多資料,但都不太理想。后來(lái)想到一個(gè)方法,那就是通過(guò)值比較的方法。比如你要校驗(yàn)的日期為:2005-12-28,你可以將它從String類型轉(zhuǎn)換為java.sql.Date類型。轉(zhuǎn)換后,再將它toString(),,這樣就會(huì)得到一個(gè)新的字符串。然后比較這兩個(gè)字符串是否相等,不等就意味著這個(gè)日期不是合法的日期。因?yàn)椋谡{(diào)用java.sql.Date.ValueOf()方法時(shí),只要日期格式正確的,當(dāng)然了,還必須是數(shù)字,那它就會(huì)自動(dòng)為你轉(zhuǎn)換為合法的日期,它會(huì)自動(dòng)幫你做日期的加減運(yùn)算,所以你是沒(méi)法通過(guò)這些來(lái)校驗(yàn)的,這樣轉(zhuǎn)換過(guò)后呢,如果日期本來(lái)就不合法,例如:2005-15-12

          它就會(huì)自動(dòng)轉(zhuǎn)換為:2006-03-12,也就是說(shuō)兩個(gè)新的字符串就發(fā)生了改變,這樣就可以比較來(lái)很快的確認(rèn)日期是否合法了。當(dāng)然如果,要校驗(yàn)的日期不是數(shù)字,那么,在進(jìn)行java.sql.Date.ValueOf()時(shí)就會(huì)拋異常的,但是如果格式不正確,還可以通過(guò)java.text.SimpleDateFormat函數(shù)來(lái)轉(zhuǎn)換,如獲取當(dāng)前的系統(tǒng)日期,可以這樣:

            public static java.sql.Date getSystemDate() throws Exception {

              SimpleDateFormat tempSimpleDateFormat = null;

              Date currentDate = null;

              try{

                tempSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

                currentDate = java.sql.Date.valueOf(tempSimpleDateFormat.format(new java.

                    util.Date()));

              }catch(Exception ex){

                ex.printStackTrace();

                throw ex;

              }finally{

                tempSimpleDateFormat = null;

              }

              return currentDate;

            }

          下面是一個(gè)身份證校驗(yàn)的方法(說(shuō)明:除了日期校驗(yàn)和數(shù)字校驗(yàn)外,其他校驗(yàn)方法是從互聯(lián)網(wǎng)上搜索得到的,但卻沒(méi)有搜到原作者,也沒(méi)有搜到原出處,以后一定補(bǔ)上,特此致歉。)

          package com.hyq.test.src;

           

          import java.text.SimpleDateFormat;

          import java.sql.Date;

          import java.util.regex.Pattern;

          import java.util.regex.Matcher;

           

          public class VerifyIdcard {

            public VerifyIdcard() {

            }

            /**

             * VerifyIdCard

             *

             * @param idcard String

             * @return boolean

             */

            public boolean VerifyIdCard(String idcard) {

              Pattern pattern = null;

              Matcher matcher = null;

              Date currentDate = null;

              Date conversionDateOne = null;  //從身份證獲取日期

              String year = null;             //從身份證獲取年

              String month = null;            //從身份證獲取月

              String day = null;              //從身份證獲取日

              String conversionDateTwo = null;//將日期轉(zhuǎn)換為字符串(中間無(wú)符號(hào))

              String verifyCode = null;       //最后一位校驗(yàn)位

              if (idcard.length() == 15) {

                idcard = uptoeighteen(idcard);

              }

              if (idcard.length() != 18) {

                return false;

              }

              try{

                pattern = Pattern.compile("\\d{17}");

                matcher = pattern.matcher(idcard);

                if (!matcher.find()) {

                  return false;

                }

                year = idcard.substring(6, 10);

                month = idcard.substring(10, 12);

                day = idcard.substring(12, 14);

                long dateOne = Long.parseLong(idcard.substring(6, 14));

                currentDate = this.getSystemDate();

                conversionDateOne = java.sql.Date.valueOf(year + "-" + month + "-" +

                                                          day);

                if (currentDate.compareTo(conversionDateOne) <= 0) {

                  return false;

                }

                conversionDateTwo = conversionDateOne.toString().substring(0, 4) +

                    conversionDateOne.toString().substring(5, 7) +

                    conversionDateOne.toString().substring(8);

                long dateTwo = Long.parseLong(conversionDateTwo);

                if (dateTwo > dateOne) {

                  return false;

                }

                verifyCode = idcard.substring(17);

                if(verifyCode != null && verifyCode.equals(this.getVerify(idcard.substring(0,17)))){

                  return true;

                }else{

                  return false;

                }

              }catch(Exception ex){

                return false;

              }finally{

                pattern = null;

                matcher = null;

                currentDate = null;

                conversionDateOne = null;

                year = null;

                month = null;

                day = null;

                conversionDateTwo = null;

              }

            }

           

          //get verify

            /**

             * getVerify

             *

             * @param eightcardid String

             * @return String

             */

            public String getVerify(String eightcardid) {

              int remaining = 0;

              int[] wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};

              int[] vi = {1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2};

              int[] ai = new int[18];

              String returnStr = null;

              try{

                if (eightcardid.length() == 18) {

                  eightcardid = eightcardid.substring(0, 17);

                }

                if (eightcardid.length() == 17) {

                  int sum = 0;

                  String k = null;

                  for (int i = 0; i < 17; i++) {

                    k = eightcardid.substring(i, i + 1);

                    ai[i] = Integer.parseInt(k);

                    k = null;

                  }

                  for (int i = 0; i < 17; i++) {

                    sum = sum + wi[i] * ai[i];

                  }

                  remaining = sum % 11;

                }

                returnStr = remaining == 2 ? "X" : String.valueOf(vi[remaining]);

              }

              catch(Exception ex){

                return null;

              }finally{

                wi = null;

                vi = null;

                ai = null;

              }

              return returnStr;

            }

          //獲取當(dāng)前系統(tǒng)日期

            /**

             * getSystemDate

             *

             * @return Date

             */

            public static java.sql.Date getSystemDate(){

              SimpleDateFormat tempSimpleDateFormat = null;

              Date currentDate = null;

              try{

                tempSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

                currentDate = java.sql.Date.valueOf(tempSimpleDateFormat.format(new java.

                    util.Date()));

              }catch(Exception ex){

                return null;

              }finally{

                tempSimpleDateFormat = null;

              }

              return currentDate;

            }

           

          //15 update to 18

            /**

             * uptoeighteen

             *

             * @param fifteencardid String

             * @return String

             */

            public String uptoeighteen(String fifteencardid) {

              String eightcardid = fifteencardid.substring(0, 6);

              eightcardid = eightcardid + "19";

              eightcardid = eightcardid + fifteencardid.substring(6, 15);

              eightcardid = eightcardid + getVerify(eightcardid);

              return eightcardid;

            }

           

           

            public static void main(String[] args){

              String idCard = "410327198107122438";

              VerifyIdcard tempVerifyIdcard = new VerifyIdcard();

              if(tempVerifyIdcard.VerifyIdCard(idCard)){

                System.out.println("+++++++++++++++++++");

              }else{

                System.out.println("*********************");

              }

            }

          }

          posted on 2005-12-28 09:03 TrampEagle 閱讀(2646) 評(píng)論(3)  編輯  收藏 所屬分類: 學(xué)習(xí)體會(huì)

          Feedback

          # re: 一個(gè)日期校驗(yàn)方法介紹和一個(gè)身份證的校驗(yàn)方法 2005-12-28 18:53 漢尼
          用正則表達(dá)式不是很好嗎??  回復(fù)  更多評(píng)論
            

          # re: 一個(gè)日期校驗(yàn)方法介紹和一個(gè)身份證的校驗(yàn)方法 2005-12-29 08:39 TrampEagle
          TO: 漢尼
          謝謝,如果能用正則表達(dá)式校驗(yàn)日期當(dāng)然更好,不過(guò),我也是剛接觸正則表達(dá)式時(shí)間不是太長(zhǎng),所以只是用于一些簡(jiǎn)單的校驗(yàn),但我會(huì)繼續(xù)學(xué)習(xí),會(huì)繼續(xù)優(yōu)化它的。  回復(fù)  更多評(píng)論
            

          # re: 一個(gè)日期校驗(yàn)方法介紹和一個(gè)身份證的校驗(yàn)方法 2006-03-23 10:22 TrampEagle
          日期校驗(yàn)的一個(gè)小方法(用javascript)
          function isValidDate(day, month, year) {
          if (month < 1 || month > 12) {
          return false;
          }
          if (day < 1 || day > 31) {
          return false;
          }
          if ((month == 4 || month == 6 || month == 9 || month == 11) &&
          (day == 31)) {
          return false;
          }
          if (month == 2) {
          var leap = (year % 4 == 0 &&
          (year % 100 != 0 || year % 400 == 0));
          if (day>29 || (day == 29 && !leap)) {
          return false;
          }
          }
          return true;
          }
          其實(shí)其他語(yǔ)言也可以的,方法也都一樣的,很老套,哈哈哈
            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 华容县| 织金县| 怀安县| 诸城市| 突泉县| 苍梧县| 建水县| 定州市| 万源市| 常宁市| 红安县| 芜湖市| 呼伦贝尔市| 武定县| 醴陵市| 奇台县| 田阳县| 余江县| 菏泽市| 甘谷县| 武隆县| 静乐县| 佛山市| 平定县| 宜昌市| 佛学| 会昌县| 安化县| 霍城县| 涿鹿县| 涟水县| 兴宁市| 普宁市| 泽库县| 白城市| 土默特左旗| 洪洞县| 桦南县| 平潭县| 凤城市| 锦屏县|