这两天做一个身份证校验的问题,碰到了日期校验的问题,为了搞的简单一点,查了很多资料,但都不太理想。后来想到一个方法,那就是通过值比较的方法。比如你要校验的日期为:2005-12-28,你可以将它从String类型转换为java.sql.Date类型。转换后,再将它toString(),,这样就会得到一个新的字符串。然后比较这两个字符串是否相等,不等就意味着这个日期不是合法的日期。因为,在调用java.sql.Date.ValueOf()方法时,只要日期格式正确的,当然了,还必须是数字,那它就会自动为你转换为合法的日期,它会自动帮你做日期的加减运算,所以你是没法通过这些来校验的,这样转换过后呢,如果日期本来就不合法,例如:2005-15-12,
它就会自动转换为:2006-03-12,也就是说两个新的字符串就发生了改变,这样就可以比较来很快的确认日期是否合法了。当然如果,要校验的日期不是数字,那么,在进行java.sql.Date.ValueOf()时就会抛异常的,但是如果格式不正确,还可以通过java.text.SimpleDateFormat函数来转换,如获取当前的系统日期,可以这样:
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;
}。
下面是一个身份证校验的方法(说明:除了日期校验和数字校验外,其他校验方法是从互联网上搜索得到的,但却没有搜到原作者,也没有搜到原出处,以后一定补上,特此致歉。)
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;//将日期转换为字符串(中间无符号)
String verifyCode = null; //最后一位校验位
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;
}
//获取当前系统日期
/**
* 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("*********************");
}
}
}