javascript 驗證身份證完全版,根據身份證獲取性別年齡

森林蘑菇_mushroom發表於2017-10-26

1.驗證身份證

var idcard=function (_v,item) {
            var area = {
                11 : "北京",
                12 : "天津",
                13 : "河北",
                14 : "山西",
                15 : "內蒙古",
                21 : "遼寧",
                22 : "吉林",
                23 : "黑龍江",
                31 : "上海",
                32 : "江蘇",
                33 : "浙江",
                34 : "安徽",
                35 : "福建",
                36 : "江西",
                37 : "山東",
                41 : "河南",
                42 : "湖北",
                43 : "湖南",
                44 : "廣東",
                45 : "廣西",
                46 : "海南",
                50 : "重慶",
                51 : "四川",
                52 : "貴州",
                53 : "雲南",
                54 : "西藏",
                61 : "陝西",
                62 : "甘肅",
                63 : "青海",
                64 : "寧夏",
                65 : "新疆",
                71 : "臺灣",
                81 : "香港",
                82 : "澳門",
                91 : "國外"
            }
            var Y, JYM;
            var S, M;
            var idcard_array = new Array();
            idcard_array = _v.split("");
            // 地區檢驗
            if (area[parseInt(_v.substr(0, 2))] == null) {
                return "身份證號碼地區非法!!,格式例如:32";
            }
            // 身份號碼位數及格式檢驗
            switch (_v.length) {
                case 15 :
                    if ((parseInt(_v.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(_v.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(_v.substr(6, 2)) + 1900) % 4 == 0)) {
                        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;// 測試出生日期的合法性
                    } else {
                        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;// 測試出生日期的合法性
                    }
                    if (ereg.test(_v)){}

                    else {
                        return "身份證號碼出生日期超出範圍,格式例如:19860817";
                    }
                    break;
                case 18 :
                    // 18位身份號碼檢測
                    // 出生日期的合法性檢查
                    // 閏年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
                    // 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
                    if (parseInt(_v.substr(6, 4)) % 4 == 0 || (parseInt(_v.substr(6, 4)) % 100 == 0 && parseInt(_v.substr(6, 4)) % 4 == 0)) {
                        ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;// 閏年出生日期的合法性正規表示式
                    } else {
                        ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;// 平年出生日期的合法性正規表示式
                    }
                    if (ereg.test(_v)) {// 測試出生日期的合法性
                        // 計算校驗位
                        S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10]))
                            * 7
                            + (parseInt(idcard_array[1]) + parseInt(idcard_array[11]))
                            * 9
                            + (parseInt(idcard_array[2]) + parseInt(idcard_array[12]))
                            * 10
                            + (parseInt(idcard_array[3]) + parseInt(idcard_array[13]))
                            * 5
                            + (parseInt(idcard_array[4]) + parseInt(idcard_array[14]))
                            * 8
                            + (parseInt(idcard_array[5]) + parseInt(idcard_array[15]))
                            * 4
                            + (parseInt(idcard_array[6]) + parseInt(idcard_array[16]))
                            * 2
                            + parseInt(idcard_array[7])
                            * 1
                            + parseInt(idcard_array[8])
                            * 6
                            + parseInt(idcard_array[9]) * 3;
                        Y = S % 11;
                        M = "F";
                        JYM = "10X98765432";
                        M = JYM.substr(Y, 1);// 判斷校驗位
                        // alert(idcard_array[17]);
                        if (M == idcard_array[17]) {
                             // 檢測ID的校驗位
                        } else {
                            return "身份證號碼末位校驗位校驗出錯,請注意x的大小寫,格式例如:201X";
                        }
                    } else {
                        return "身份證號碼出生日期超出範圍,格式例如:19860817";
                    }
                    break;
                default :
                    return "身份證號碼位數不對,應該為15位或是18位";
                    break;
            }
        }複製程式碼

2.通過身份證號碼得到性別

 /**
         * 通過身份證號碼得到性別
         *  身份證號碼 return 1/2 男/女
*/
var getSexForCard=function (str) {
            var inputStr = str.toString();
            var sex;
            if (inputStr.length == 18) {
                sex = inputStr.charAt(16);
                if (sex % 2 == 0) {
                    return 2;
                } else {
                    return 1;
                }
            } else {
                sex = inputStr.charAt(14);
                if (sex % 2 == 0) {
                    return 2;
                } else {
                    return 1;
                }
            }
        }複製程式碼

3.通過身份證號碼得到年齡

var jsGetAge=function (strBirthday) {
            var returnAge;
            var birthYear = strBirthday.slice(0,4);
            var birthMonth = strBirthday.slice(4,6);
            var birthDay = strBirthday.slice(6);

            d = new Date();
            var nowYear = d.getFullYear();
            var nowMonth = d.getMonth() + 1;
            var nowDay = d.getDate();

            if(nowYear == birthYear){
                returnAge = 0;//同年 則為0歲
            }
            else{
                var ageDiff = nowYear - birthYear ; //年之差
                if(ageDiff > 0){
                    if(nowMonth == birthMonth) {
                        var dayDiff = nowDay - birthDay;//日之差
                        if(dayDiff < 0)
                        {
                            returnAge = ageDiff - 1;
                        }
                        else
                        {
                            returnAge = ageDiff ;
                        }
                    }
                    else
                    {
                        var monthDiff = nowMonth - birthMonth;//月之差
                        if(monthDiff < 0)
                        {
                            returnAge = ageDiff - 1;
                        }
                        else
                        {
                            returnAge = ageDiff ;
                        }
                    }
                }
                else
                {
                    returnAge = -1;//返回-1 表示出生日期輸入錯誤 晚於今天
                }
            }

            return returnAge;//返回週歲年齡
        }複製程式碼

相關文章