JAVA版身份证获取性别、出生日期及年龄

        工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。

CertificateNo.java

package com.bijian.study;

import java.util.Calendar;
import java.util.regex.Pattern;

/**
 * 根据身份证获取性别、出生日期、年龄,支持15、18位身份证
 */
public class CertificateNo {

    public ResultDTO parseCertificateNo(String certificateNo) {
        
        ResultDTO resultDTO = new ResultDTO();
        String myRegExpIDCardNo = "^\\d{6}(((19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\\d{3}([0-9]|x|X))|(\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\\d{3}))$";
        boolean valid=Pattern.matches(myRegExpIDCardNo,certificateNo)||(certificateNo.length() == 17 && Pattern.matches(myRegExpIDCardNo,certificateNo.substring(0,15)));
        if(!valid){
            resultDTO.setStatueMessage("证件号码不规范!");
            return resultDTO;
        }
        int idxSexStart = 16;
        int birthYearSpan = 4;
        //如果是15位的证件号码
        if(certificateNo.length() == 15) {
            idxSexStart = 14;
            birthYearSpan = 2;
        }
        
        //性别
        String idxSexStr = certificateNo.substring(idxSexStart, idxSexStart + 1);
        int idxSex = Integer.parseInt(idxSexStr) % 2;
        String sex = (idxSex == 1) ? "M" : "F";
        resultDTO.setSex(sex);
        
        //出生日期
        String year = (birthYearSpan == 2 ? "19" : "") + certificateNo.substring(6, 6 + birthYearSpan);
        String month = certificateNo.substring(6 + birthYearSpan, 6 + birthYearSpan + 2);
        String day = certificateNo.substring(8 + birthYearSpan, 8 + birthYearSpan + 2);
        String birthday = year + '-' + month + '-' + day;
        resultDTO.setBirthday(birthday);
        
        //年龄
        Calendar certificateCal = Calendar.getInstance();
        Calendar currentTimeCal = Calendar.getInstance();
        certificateCal.set(Integer.parseInt(year), Integer.parseInt(month)-1, Integer.parseInt(day));
        int yearAge = (currentTimeCal.get(currentTimeCal.YEAR)) - (certificateCal.get(certificateCal.YEAR));
        certificateCal.set(currentTimeCal.get(Calendar.YEAR), Integer.parseInt(month)-1, Integer.parseInt(day));
        int monthFloor = (currentTimeCal.before(certificateCal) ? 1 : 0);
        resultDTO.setAge(yearAge - monthFloor);
        
        return resultDTO;
    }
}

ResultDTO.java

package com.bijian.study;

public class ResultDTO {
    
    private String statueMessage;
    private String sex;
    private String birthday;
    private int age;
    
    public String getStatueMessage() {
        return statueMessage;
    }
    public void setStatueMessage(String statueMessage) {
        this.statueMessage = statueMessage;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    public String toString() {
        String res = "";
        if(this.statueMessage != null) {
            res += this.statueMessage;
        }else {
            res += "sex:" + this.sex + ",birthday:" + this.birthday + ",age:" + this.age;
        }
        return res;
    }
}

CertificateNoTest.java

package com.bijian.test;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import com.bijian.study.CertificateNo;
import com.bijian.study.ResultDTO;

/**
 * 说明:
 * 1.身份证信息完全是测试时随便写的,如有雷同,纯属巧合
 * 2.写此测试案例的日期是2015-02-08,有测生日当天及前后的案例,后续再运行需更改
 */
public class CertificateNoTest {
    
    private CertificateNo certificateNo;
    private ResultDTO resultDTO;
    
    @Before
    public void setUp() throws Exception {
        certificateNo = new CertificateNo();
    }

    @Test
    public void test_abnormality_certificateNo_of_18_digit_430522199812623535() {
        
        resultDTO = certificateNo.parseCertificateNo("430522199812623535");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("证件号码不规范!", resultDTO.getStatueMessage());   
    }
    
    @Test
    public void test_abnormality_certificateNo_of_18_digit_430522198813013210() {
        
        resultDTO = certificateNo.parseCertificateNo("430522198813013210");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("证件号码不规范!", resultDTO.getStatueMessage());   
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_430522199812101515() {
        
        resultDTO = certificateNo.parseCertificateNo("430522199812101515");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1998-12-10", resultDTO.getBirthday());  
        Assert.assertEquals(16, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_430522199812101595() {
        
        resultDTO = certificateNo.parseCertificateNo("430522199812101595");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1998-12-10", resultDTO.getBirthday());  
        Assert.assertEquals(16, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_430522199812101585() {
        
        resultDTO = certificateNo.parseCertificateNo("430522199812101585");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("F", resultDTO.getSex());
        Assert.assertEquals("1998-12-10", resultDTO.getBirthday());  
        Assert.assertEquals(16, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_430522198810103212() {
        
        resultDTO = certificateNo.parseCertificateNo("430522198810103212");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1988-10-10", resultDTO.getBirthday());  
        Assert.assertEquals(26, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_before_birthday() {
        
        //测试的时间是2015-02-08,表明昨天刚过生日
        resultDTO = certificateNo.parseCertificateNo("430522198802073210");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1988-02-07", resultDTO.getBirthday());  
        Assert.assertEquals(27, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_birthday() {
        
        //测试的时间是2015-02-08,表明当天正好生日
        resultDTO = certificateNo.parseCertificateNo("430522198802083210");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1988-02-08", resultDTO.getBirthday());  
        Assert.assertEquals(27, resultDTO.getAge());  
    }
    
    @Test
    public void test_normality_certificateNo_of_18_digit_after_birthday() {
        
        //测试的时间是2015-02-08,表明第二天才过生日
        resultDTO = certificateNo.parseCertificateNo("430522198802093210");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1988-02-09", resultDTO.getBirthday());  
        Assert.assertEquals(26, resultDTO.getAge());  
    }
    
    @Test
    public void test_abnormality_certificateNo_of_15_digit_130503671401001() {
        
        resultDTO = certificateNo.parseCertificateNo("130503671401001");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("证件号码不规范!", resultDTO.getStatueMessage());   
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_430522760201356() {
        
        resultDTO = certificateNo.parseCertificateNo("430522760201356");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("F", resultDTO.getSex());
        Assert.assertEquals("1976-02-01", resultDTO.getBirthday());  
        Assert.assertEquals(39, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_130503670401001() {
        
        resultDTO = certificateNo.parseCertificateNo("130503670401001");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1967-04-01", resultDTO.getBirthday());  
        Assert.assertEquals(47, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_370802940221002() {
        
        resultDTO = certificateNo.parseCertificateNo("370802940221002");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("F", resultDTO.getSex());
        Assert.assertEquals("1994-02-21", resultDTO.getBirthday());  
        Assert.assertEquals(20, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_370802941031331() {
        
        resultDTO = certificateNo.parseCertificateNo("370802941031331");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1994-10-31", resultDTO.getBirthday());  
        Assert.assertEquals(20, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_before_birthday() {
        
        //测试的时间是2015-02-08,表明昨天刚过生日
        resultDTO = certificateNo.parseCertificateNo("370802940207331");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1994-02-07", resultDTO.getBirthday());  
        Assert.assertEquals(21, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_birthday() {
        
        //测试的时间是2015-02-08,表明当天正好生日
        resultDTO = certificateNo.parseCertificateNo("370802940208331");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1994-02-08", resultDTO.getBirthday());  
        Assert.assertEquals(21, resultDTO.getAge());    
    }
    
    @Test
    public void test_normality_certificateNo_of_15_digit_after_birthday() {
        
        //测试的时间是2015-02-08,表明第二天才过生日
        resultDTO = certificateNo.parseCertificateNo("370802940209331");
        Assert.assertNotNull(resultDTO);   
        Assert.assertEquals("M", resultDTO.getSex());
        Assert.assertEquals("1994-02-09", resultDTO.getBirthday());  
        Assert.assertEquals(20, resultDTO.getAge());    
    }
}

 

你可能感兴趣的:(java,性别,出生日期,年龄)