java身份证验证工具类

此身份证工具类有如下功能:

1、验证身份证号码是否合法。(16位或18位)

2、通过身份证号码计算年龄 。

3、通过身份证号码计算出生日期

4、通过身份证号码计算性别

package com.ciming.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class IDCardUtil {
    private final static int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
            5, 8, 4, 2, 1 };
    private final static int[] vi = { 1, 0, ‘X‘, 9, 8, 7, 6, 5, 4, 3, 2 };
    private static int[] ai = new int[18];

    /**
     * 验证身份证
     *
     * @param idcard
     * @return
     */
    public static boolean VerifyIDCard(String idcard) {
        if (idcard.length() == 15) {
            idcard = uptoeighteen(idcard);
        }
        if (idcard.length() != 18) {
            return false;
        }
        String verify = idcard.substring(17, 18);
        if (verify.equals(getVerify(idcard))) {
            return true;
        }
        return false;
    }

    private static String getVerify(String eightcardid) {
        int remaining = 0;
        if (eightcardid.length() == 18) {
            eightcardid = eightcardid.substring(0, 17);
        }
        if (eightcardid.length() == 17) {
            int sum = 0;
            for (int i = 0; i < 17; i++) {
                String k = eightcardid.substring(i, i + 1);
                ai[i] = Integer.parseInt(k);
            }
            for (int i = 0; i < 17; i++) {
                sum = sum + wi[i] * ai[i];
            }
            remaining = sum % 11;
        }
        return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
    }

    private static 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;
    }

    /**
     * 获取性别
     *
     * @param idcard
     * @return
     */
    public static String getSex(String idcard) {
        String inputStr = idcard.toString();
        int sex;
        if (inputStr.length() == 18) {
            sex = inputStr.charAt(16);
            if (sex % 2 == 0) {
                return "女";
            } else {
                return "男";
            }
        } else {
            sex = inputStr.charAt(14);
            if (sex % 2 == 0) {
                return "女";
            } else {
                return "男";
            }
        }
    }

    /**
     * 获得出生日期
     *
     * @param idcard
     * @return
     * @throws ParseException
     */
    public static Date getBirthDate(String idcard) throws ParseException {
        String year;
        String month;
        String day;
        if (idcard.length() == 18) { // 处理18位身份证
            year = idcard.substring(6, 10);
            month = idcard.substring(10, 12);
            day = idcard.substring(12, 14);
        } else { // 处理非18位身份证
            year = idcard.substring(6, 8);
            month = idcard.substring(8, 10);
            day = idcard.substring(10, 12);
            year = "19" + year;
        }
        return new SimpleDateFormat("yyyy-MM-dd").parse(year + "-" + month
                + "-" + day);

    }

    /**
     * 根据身份证计算周岁
     * @throws ParseException
     */
    public static int getAge(String idcard) throws ParseException {
        Calendar calBirth = Calendar.getInstance();
        Calendar today = Calendar.getInstance();
        Date birthDate = getBirthDate(idcard);
        calBirth.setTime(birthDate);
        return getYearDiff(today, calBirth);
    }

    public static int getYearDiff(Calendar cal, Calendar cal1) {
        int m = (cal.get(cal.MONTH)) - (cal1.get(cal1.MONTH));
        int y = (cal.get(cal.YEAR)) - (cal1.get(cal1.YEAR));
        return (y * 12 + m) / 12;
    }

    public static void main(String[] args) {

    }
}
时间: 2024-08-25 16:18:09

java身份证验证工具类的相关文章

Java常用正则表达式验证工具类RegexUtils.java

原文:Java常用正则表达式验证工具类RegexUtils.java 源代码下载地址:http://www.zuidaima.com/share/1550463379442688.htm Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. 身份证 10. 域名 11. IP .... 常用验证应有尽有! 这的确是您从事 web 开发,服务器端表单验证

Java、Android身份证验证工具 支持15/18位、地区、生日和校验码验证

首先科普一下身份证的一些知识(知道的勿喷) 1-2 位:代表升级行政区代码 3-4 位:代表地级行政区划分代码 5-6 位:代表县区行政区分代码 7-14 位:代表出生年.月.日,例如:19900101 15-17 位:代表 顺序码,同一地区同年.同月.同日出生人的编号,奇数是男性,偶数是女性 18 位:代表校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示 注:另外有些15位的身份证号码,年份使用2位数字表示的,并且没有最后一位校验码:从1999年10月1日起,全国实行公

验证工具类 - ValidateUtils.java

验证工具类,提供验证email格式.是否ipv4.是否ipv6.是否中文.是否数字.正则表达式验证的方法. 源码如下:(点击下载 - ValidateUtils.java .commons-lang-2.6.jar.httpclient-4.3.3.jar) import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.a

UrlUtils工具类,Java URL工具类,Java URL链接工具类

UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月15日 http://www.cnblogs.com/fanshuyao/ Java代码   import java.util.Ha

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

[精品] 收集的27个java开发常用工具类.基本满足开发需求

原文:[精品] 收集的27个java开发常用工具类.基本满足开发需求 源代码下载地址:http://www.zuidaima.com/share/1596028005993472.htm 最近从网上收集的java开发常用的工具类,分享给大家.基本满足开发需求.推荐给热爱最代码以及java的牛牛们.   每个类都有注释的,欢迎大家可以下载使用. 字符编码:CharTools, base64:Base64 *.java Md5加密:  MD5*.java 上传:*Uploader* 生成缩略图类:T

java MD5数据加密工具类

package com.wetuo.util; import java.security.MessageDigest; /**  * 数据加密工具类  * @author wzp  *  */ public class DataUtil { public static String md5(String str) { StringBuffer buffer = new StringBuffer(); char[] chars = { '0', '1', '2', '3', '4', '5', '

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类   =========================== ?Copyright 蕃薯耀 2017年9月25日 http://www.cnblogs.com/fanshuyao/ 一.问题描述 很多对外网站的某些内容都需要过滤敏感词,避免政治与色@情上的问题. 二.解决方案 使用词库进行匹配过滤成 * (星号) Java 敏感词工具类及敏感词词库见附件. 1.下载后,有几个类,主要为WordFilter 这个工具类,使用方法如下

Redis Java客户端jedis工具类以及Redis实现的跨jvm的锁

Redis Java客户端jedis工具类以及Redis实现的跨jvm的锁 最近项目中使用redis,学习了一下,client端使用jedis-2.1.0 首先是一个redis实现的跨jvm的lock, 接着是一个简单封装的工具类,也对pipeline处理进行了几个常用的封装 然后是对应Spring的相关配置 Java代码   public class RedisLock { /** 加锁标志 */ public static final String LOCKED = "TRUE";