国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java從身份證號碼中提取出生年月日

這篇具有很好參考價值的文章主要介紹了java從身份證號碼中提取出生年月日。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

給一個String 類型的 身份證號碼,需要從這串數(shù)字中獲取出生日期、性別、年齡文章來源地址http://www.zghlxwxcb.cn/news/detail-617756.html


一、問題描述:

????????給一個String 類型的 身份證號碼,需要從這串數(shù)字中獲取出生日期、性別、年齡。身份證號碼分為 15 位 和18 位

二、代碼部分

public class IdCardNumberMethod {

    /**
     * 獲取出生日期
     *
     * @return 返回字符串類型
     */
    public String getBirthFromIdCard(String idCard) {
        if (idCard.length() != 18 && idCard.length() != 15) {
            return "請輸入正確的身份證號碼";
        }
        if (idCard.length() == 18) {
            String year = idCard.substring(6).substring(0, 4);// 得到年份
            String month = idCard.substring(10).substring(0, 2);// 得到月份
            String day = idCard.substring(12).substring(0, 2);// 得到日
            return (year + "-" + month + "-" + day);
        } else if (idCard.length() == 15) {
            String year = "19" + idCard.substring(6, 8);// 年份
            String month = idCard.substring(8, 10);// 月份
            String day = idCard.substring(10, 12);// 得到日
            return (year + "-" + month + "-" + day);
        }
        return null;
    }

    /**
     * 獲取出生日期
     *
     * @return 返回日期格式
     */
    public Date getBirthDayFromIdCard(String idCard) throws ParseException {
        Date birth = null;
        if (idCard.length() == 18) {
            String year = idCard.substring(6).substring(0, 4);// 得到年份
            String month = idCard.substring(10).substring(0, 2);// 得到月份
            String day = idCard.substring(12).substring(0, 2);// 得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            birth = format.parse(year + "-" + month + "-" + day);
        } else if (idCard.length() == 15) {
            String year = "19" + idCard.substring(6, 8);// 年份
            String month = idCard.substring(8, 10);// 月份
            String day = idCard.substring(10, 12);// 得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            birth = format.parse(year + "-" + month + "-" + day);
        }
        return birth;
    }

    /**
     * 獲取性別
     *         0=未知的性別,9=未說明的性別,2=女性,1=男性
     * @return int
     */
    public int getSexFromIdCard(String idCard) {
        int sex = 9;
        // 身份證號碼為空
        if (idCard == "" || idCard.length() <= 0){
            return sex = 0;
        }
        if (idCard.length() == 18) {
            if (Integer.parseInt(idCard.substring(16).substring(0, 1)) % 2 == 0) {// 判斷性別
                sex = 2; // 女
            } else {
                sex = 1; // 男
            }
        } else if (idCard.length() == 15) {
            String usex = idCard.substring(14, 15);// 用戶的性別
            if (Integer.parseInt(usex) % 2 == 0) {
                sex = 2; // 女
            } else {
                sex = 1; // 男
            }
        }
        return sex;
    }

    /**
     * 根據(jù)身份證的號碼算出當前身份證持有者的年齡
     *
     * @param
     * @throws Exception
     * @return  -1(表示異常) 0 (身份證號碼為空)
     */
    public int getAgeForIdcard(String idcard) {
        try {
            int age = 0;
            if (StringUtils.isEmpty(idcard)) {
                return age;
            }

            String birth = "";
            if (idcard.length() == 18) {
                birth = idcard.substring(6, 14);
            } else if (idcard.length() == 15) {
                birth = "19" + idcard.substring(6, 12);
            }

            int year = Integer.valueOf(birth.substring(0, 4));
            int month = Integer.valueOf(birth.substring(4, 6));
            int day = Integer.valueOf(birth.substring(6));
            Calendar cal = Calendar.getInstance();
            age = cal.get(Calendar.YEAR) - year;
            //周歲計算
            if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) {
                age--;
            }
            return age;
        } catch (Exception e) {
            e.getMessage();
        }
        return -1;
    }

    /**
     * 15 位身份證號碼轉(zhuǎn) 18 位
     * <p>
     * 15位身份證號碼:第7、8位為出生年份(兩位數(shù)),第9、10位為出生月份,第11、12位代表出生日期,第15位代表性別,奇數(shù)為男,偶數(shù)為女。
     * 18位身份證號碼:第7、8、9、10位為出生年份(四位數(shù)),第11、第12位為出生月份,第13、14位代表出生日期,第17位代表性別,奇數(shù)為男,偶數(shù)為女。
     */
    public StringBuffer IdCardMethod15To18(String idCard) {
        //將字符串轉(zhuǎn)化為buffer進行操作
        StringBuffer stringBuffer = new StringBuffer(idCard);
        //身份證最后一位校驗碼,X代表10(順序固定)
        char[] checkIndex = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
        int sum = 0;
        //在第6位插入年份的前兩位19
        stringBuffer.insert(6, "19");
        for (int i = 0; i < stringBuffer.length(); i++) {
            char c = stringBuffer.charAt(i);
            //前17位數(shù)字
            int ai = Integer.valueOf(String.valueOf(c));
            //前17位每位對應(yīng)的系數(shù)(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 )
            int wi = ((int) Math.pow(2, stringBuffer.length() - i)) % 11;
            //總和(每位數(shù)字乘以系數(shù)再相加)
            sum = sum + ai * wi;
        }
        //總和除以11求余
        int indexOf = sum % 11;
        //根據(jù)余數(shù)作為下表在校驗碼數(shù)組里取值
        stringBuffer.append(checkIndex[indexOf]);
        return stringBuffer;
    }

}

三、補充一下身份證號的校驗,15位和18位都可以進行

/**
     * 身份證號碼驗證
     *
     * @param idCard
     * @return
     */
    public static boolean validateIdCard(String idCard) throws Exception {
        if (idCard == null || "".equals(idCard)) {
            throw new Exception("身份證號碼為空");
        }
        if (idCard.length() != 18 && idCard.length() != 15) {
            throw new Exception("身份證號碼長度不正確");
        }
        // 判別用戶身份證號的正則表達式(15位或者18位,最后一位可以為字母)
        String regularExpression =
                "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
                        + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";

        boolean matches = idCard.matches(regularExpression);

        // 判斷第18位校驗值
        if (matches) {
            if (idCard.length() == 18) {
                try {
                    char[] charArray = idCard.toCharArray();
                    // 前十七位加權(quán)因子
                    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                    // 這是除以11后,可能產(chǎn)生的11位余數(shù)對應(yīng)的驗證碼
                    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
                    int sum = 0;
                    for (int i = 0; i < idCardWi.length; i++) {
                        int current = Integer.parseInt(String.valueOf(charArray[i]));
                        int count = current * idCardWi[i];
                        sum += count;
                    }
                    char idCardLast = charArray[17];
                    int idCardMod = sum % 11;
                    if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {
                        return true;
                    } else {
                        return false;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
            if (idCard.length() == 15) {
                validateIdCard(String.valueOf(idCardMethod15To18(idCard)));
            }
        }
        return matches;
    }

到了這里,關(guān)于java從身份證號碼中提取出生年月日的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 身份證號碼正則表達式詳解

    身份證號碼正則表達式詳解

    公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一 位 校驗碼 組成 。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。 地址碼 : ( 身份證號碼第一位到第六位 ) 表示編碼對象常住戶口所在 的 行政區(qū)劃代碼,按

    2024年02月06日
    瀏覽(98)
  • 8.OpenCV-識別身份證號碼(Python)

    8.OpenCV-識別身份證號碼(Python)

    需求描述: 通過OpenCV識別身份證照片上的身份證號碼(僅識別身份證號碼) 實現(xiàn)思路: 1.將身份證號中的0,1,2,3,4,5,6,7,8,9作為模板,與身份證照片中的身份證號碼區(qū)域進行模板匹配。 2.先要制作一個身份證號碼模板,我這里弄了一個,基本上可以用。 ?3.識別出身份證照片身

    2024年02月11日
    瀏覽(96)
  • 根據(jù)身份證號碼判斷是否是未成年人

    ?/**** ? ? ?* 根據(jù)身份證號計算年齡 ? ? ?* @param str ? ? ? ?* @param currDate? ? ? ?* @return ? ? ?*/ ? ? public boolean calcYear(String str, Date currDate){ ? ? ? ? DateFormat dateFormat = new SimpleDateFormat(\\\"yyyyMMdd\\\"); ? ? ? ? Long year = Long.parseLong(str.substring(0,4)); ? ? ? ? Long month = Long.parseLong(st

    2023年04月23日
    瀏覽(102)
  • 身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)

    身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)

    自定義一個用于校驗 身份證號碼 格式的注解 @IdCard ,能夠和現(xiàn)有的 Validation 參數(shù)校驗機制兼容,使用方式和其他校驗注解保持一致(使用 @Valid 注解接口參數(shù))。 本文使用原生方式實現(xiàn)校驗邏輯,校驗規(guī)則的實現(xiàn)較為基礎(chǔ);Hutool工具提供了更加完善的校驗工具,可以考慮使

    2024年02月07日
    瀏覽(98)
  • 身份證號碼的正則表達式及驗證詳解(JavaScript,Regex)

    簡言 在做用戶實名驗證時,常會用到身份證號碼的正則表達式及校驗方案。本文列舉了兩種驗證方案,大家可以根據(jù)自己的項目實際情況,選擇適合的方案 身份證號碼說明 居民身份證號碼,正確、正式的稱謂應(yīng)該是“公民身份號碼”。根據(jù)【中華人民共和國國家標準 GB 11

    2023年04月20日
    瀏覽(437)
  • 常用的表單校驗規(guī)則——郵箱/QQ/身份證號碼/微信/電話/數(shù)字字母/整數(shù)/文本/密碼等

    1.郵箱校驗規(guī)則 2.郵箱校驗規(guī)則 ?3.QQ校驗規(guī)則 4.身份證號碼校驗規(guī)則? ?5.微信校驗規(guī)則 6.電話校驗規(guī)則? 7.銀行卡號校驗規(guī)則? 8.數(shù)字字母校驗規(guī)則? 9.整數(shù)校驗規(guī)則? 10.數(shù)字校驗規(guī)則? 11.文本校驗規(guī)則? 12.密碼校驗規(guī)則? 最后附上 rules 中的使用方法? ? ? ? ? ? ?

    2024年02月05日
    瀏覽(92)
  • python提取身份證中的生日和性別

    1. 我們的身份證號碼是一串18位的數(shù)字,其中包含了許多關(guān)于持有人身份的信息,比如出生日期和性別。前6位是地區(qū)碼,接下來的8位是出生日期,然后是順序碼和性別碼, 最后一位是校驗碼。性別由倒數(shù)第二位表示,奇數(shù)為男,偶數(shù)為女。 2.解析身份證號碼中的出生日期,

    2024年03月24日
    瀏覽(87)
  • 用python從身份證中提取生日信息(切片計算)
  • 安裝PaddlePaddle及使用PP-OCRv3 模型提取身份證信息

    1)目標 本指南的首要目的是提供一種快速使用百度開源深度學習平臺(飛漿平臺)的方法,飛漿平臺提供了很多已經(jīng)完成訓練的AI模型,讓了解 Python、Docker、Linux 基礎(chǔ)知識的開發(fā)人員能夠在 一至幾個工作日 內(nèi)完成飛漿AI模型在項目的使用搭建; 飛漿平臺支持的硬件環(huán)境:

    2024年02月11日
    瀏覽(16)
  • 【計算機視覺|風格遷移】PP-GAN:使用GAN的地標提取器將韓國人像的風格轉(zhuǎn)化為身份證照片

    【計算機視覺|風格遷移】PP-GAN:使用GAN的地標提取器將韓國人像的風格轉(zhuǎn)化為身份證照片

    本系列博文為深度學習/計算機視覺論文筆記,轉(zhuǎn)載請注明出處 標題: PP-GAN : Style Transfer from Korean Portraits to ID Photos Using Landmark Extractor with GAN 鏈接:[2306.13418] PP-GAN : Style Transfer from Korean Portraits to ID Photos Using Landmark Extractor with GAN (arxiv.org) 風格轉(zhuǎn)換的目標是在保持圖像內(nèi)容的同

    2024年02月13日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包