/**
* 身份证号码的格式:610821-20061222-612-X
* 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,
* 第18位为校验码。检验码分别是0-10共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。
* 当今的身份证号码有15位和18位之分。1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
* (1)前1、2位数字表示:所在省份的代码;
* (2)第3、4位数字表示:所在城市的代码;
* (3)第5、6位数字表示:所在区县的代码;
* (4)第7~14位数字表示:出生年、月、日;
* (5)第15、16位数字表示:所在地的派出所的代码;
* (6)第17位数字表示性别:奇数表示男性,偶数表示女性
* (7)第18位数字是校检码:根据一定算法生成
*
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public class CheckIdCardUtil {
public static String IDCardValidate(String IDStr) throws ParseException {
String tipInfo = "该身份证有效!";// 记录错误信息
String Ai = "";
// 判断号码的长度 15位或18位
if (IDStr.length() != 15 && IDStr.length() != 18) {
tipInfo = "身份证号码长度应该为15位或18位。";
return tipInfo;
}
// 18位身份证前17位位数字,如果是15位的身份证则所有号码都为数字
if (IDStr.length() == 18) {
Ai = IDStr.substring(0, 17);
} else if (IDStr.length() == 15) {
Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
}
if (isNumeric(Ai) == false) {
tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
return tipInfo;
}
// 判断出生年月是否有效
String strYear = Ai.substring(6, 10);// 年份
String strMonth = Ai.substring(10, 12);// 月份
String strDay = Ai.substring(12, 14);// 日期
if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
tipInfo = "身份证出生日期无效。";
return tipInfo;
}
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
try {
if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
|| (gc.getTime().getTime() - s.parse(
strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
tipInfo = "身份证生日不在有效范围。";
return tipInfo;
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (java.text.ParseException e) {
e.printStackTrace();
}
if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
tipInfo = "身份证月份无效";
return tipInfo;
}
if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
tipInfo = "身份证日期无效";
return tipInfo;
}
// 判断地区码是否有效
Hashtable areacode = GetAreaCode();
//如果身份证前两位的地区码不在Hashtable,则地区码有误
if (areacode.get(Ai.substring(0, 2)) == null) {
tipInfo = "身份证地区编码错误。";
return tipInfo;
}
if(isVarifyCode(Ai,IDStr)==false){
tipInfo = "身份证校验码无效,不是合法的身份证号码";
return tipInfo;
}
return tipInfo;
}
/*
* 判断第18位校验码是否正确
* 第18位校验码的计算方式:
1. 对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0, ... , 16
其中Ai表示第i个位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2. 用11对计算结果取模
Y = mod(S, 11)
3. 根据模的值得到对应的校验码
对应关系为:
Y值: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
*/
private static boolean isVarifyCode(String Ai,String IDStr) {
String[] VarifyCode = { "1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2" };
String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2" };
int sum = 0;
for (int i = 0; i < 17; i++) {
sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
}
int modValue = sum % 11;
String strVerifyCode = VarifyCode[modValue];
Ai = Ai + strVerifyCode;
if (IDStr.length() == 18) {
if (Ai.equals(IDStr) == false) {
return false;
}
}
return true;
}
/**
* 将所有地址编码保存在一个Hashtable中
* @return Hashtable 对象
*/
private static Hashtable GetAreaCode() {
Hashtable hashtable = new Hashtable();
hashtable.put("11", "北京");
hashtable.put("12", "天津");
hashtable.put("13", "河北");
hashtable.put("14", "山西");
hashtable.put("15", "内蒙古");
hashtable.put("21", "辽宁");
hashtable.put("22", "吉林");
hashtable.put("23", "黑龙江");
hashtable.put("31", "上海");
hashtable.put("32", "江苏");
hashtable.put("33", "浙江");
hashtable.put("34", "安徽");
hashtable.put("35", "福建");
hashtable.put("36", "江西");
hashtable.put("37", "山东");
hashtable.put("41", "河南");
hashtable.put("42", "湖北");
hashtable.put("43", "湖南");
hashtable.put("44", "广东");
hashtable.put("45", "广西");
hashtable.put("46", "海南");
hashtable.put("50", "重庆");
hashtable.put("51", "四川");
hashtable.put("52", "贵州");
hashtable.put("53", "云南");
hashtable.put("54", "西藏");
hashtable.put("61", "陕西");
hashtable.put("62", "甘肃");
hashtable.put("63", "青海");
hashtable.put("64", "宁夏");
hashtable.put("65", "新疆");
hashtable.put("71", "台湾");
hashtable.put("81", "香港");
hashtable.put("82", "澳门");
hashtable.put("91", "国外");
return hashtable;
}
/**
* 判断字符串是否为数字,0-9重复0次或者多次
* @param strnum
* @return
*/
private static boolean isNumeric(String strnum) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(strnum);
if (isNum.matches()) {
return true;
} else {
return false;
}
}
/**
* 功能:判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天
*
* @param string
* @return
*/
public static boolean isDate(String strDate) {
Pattern pattern = Pattern
.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$");
Matcher m = pattern.matcher(strDate);
if (m.matches()) {
return true;
} else {
return false;
}
}
}
public class ToolDateTime { /** 日期格式:yyyy-MM-dd HH:mm:ss **/ public static final String DF_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; /** 日期格式:yyyy-MM-dd HH:mm **/ public static final String DF_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; /** 日期格式:yyyy-MM-dd **/ public static final String DF_YYYY_MM_DD = "yyyy-MM-dd"; /** 日期格式:HH:mm:ss **/ public static final String DF_HH_MM_SS = "HH:mm:ss"; /** 日期格式:HH:mm **/ public static final String DF_HH_MM = "HH:mm"; private final static long MINUTE = 60 * 1000;// 1分钟 private final static long HOUR = 60 * MINUTE;// 1小时 private final static long DAY = 24 * HOUR;// 1天 private final static long MONTH = 31 * DAY;// 月 private final static long YEAR = 12 * MONTH;// 年 /** Log输出标识 **/ private static final String TAG = ToolDateTime.class.getSimpleName(); /** * 将日期格式化成友好的字符串:几分钟前、几小时前、几天前、几月前、几年前、刚刚 * * @param date * @return */ public static String formatFriendly(Date date) { if (date == null) { return null; } long diff = new Date().getTime() - date.getTime(); long r = 0; if (diff > YEAR) { r = (diff / YEAR); return r + "年前"; } if (diff > MONTH) { r = (diff / MONTH); return r + "个月前"; } if (diff > DAY) { r = (diff / DAY); return r + "天前"; } if (diff > HOUR) { r = (diff / HOUR); return r + "个小时前"; } if (diff > MINUTE) { r = (diff / MINUTE); return r + "分钟前"; } return "刚刚"; } /** * 将日期以yyyy-MM-dd HH:mm:ss格式化 * * @param dateL * 日期 * @return */ public static String formatDateTime(long dateL) { SimpleDateFormat sdf = new SimpleDateFormat(DF_YYYY_MM_DD_HH_MM_SS); Date date = new Date(dateL); return sdf.format(date); } /** * 将日期以yyyy-MM-dd HH:mm:ss格式化 * * @param dateL * 日期 * @return */ public static String formatDateTime(long dateL, String formater) { SimpleDateFormat sdf = new SimpleDateFormat(formater); return sdf.format(new Date(dateL)); } /** * 将日期以yyyy-MM-dd HH:mm:ss格式化 * * @param dateL * 日期 * @return */ public static String formatDateTime(Date date, String formater) { SimpleDateFormat sdf = new SimpleDateFormat(formater); return sdf.format(date); } /** * 将日期字符串转成日期 * * @param strDate * 字符串日期 * @return java.util.date日期类型 */ public static Date parseDate(String strDate) { DateFormat dateFormat = new SimpleDateFormat(DF_YYYY_MM_DD_HH_MM_SS); Date returnDate = null; try { returnDate = dateFormat.parse(strDate); } catch (ParseException e) { KLog.v(TAG, "parseDate failed !"); } return returnDate; } /** * 获取系统当前日期 * * @return */ public static Date gainCurrentDate() { return new Date(); } /** * 验证日期是否比当前日期早 * * @param target1 * 比较时间1 * @param target2 * 比较时间2 * @return true 则代表target1比target2晚或等于target2,否则比target2早 */ public static boolean compareDate(Date target1, Date target2) { boolean flag = false; try { String target1DateTime = ToolDateTime.formatDateTime(target1, DF_YYYY_MM_DD_HH_MM_SS); String target2DateTime = ToolDateTime.formatDateTime(target2, DF_YYYY_MM_DD_HH_MM_SS); if (target1DateTime.compareTo(target2DateTime) <= 0) { flag = true; } } catch (Exception e1) { KLog.e("比较失败,原因:" + e1.getMessage()); } return flag; } /** * 对日期进行增加操作 * * @param target * 需要进行运算的日期 * @param hour * 小时 * @return */ public static Date addDateTime(Date target, double hour) { if (null == target || hour < 0) { return target; } return new Date(target.getTime() + (long) (hour * 60 * 60 * 1000)); } /** * 对日期进行相减操作 * * @param target * 需要进行运算的日期 * @param hour * 小时 * @return */ public static Date subDateTime(Date target, double hour) { if (null == target || hour < 0) { return target; } return new Date(target.getTime() - (long) (hour * 60 * 60 * 1000)); } private static SimpleDateFormat second = new SimpleDateFormat( "yy-MM-dd hh:mm:ss"); private static SimpleDateFormat day = new SimpleDateFormat("yyyy-MM-dd"); private static SimpleDateFormat detailDay = new SimpleDateFormat("yyyy年MM月dd日"); private static SimpleDateFormat fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); private static SimpleDateFormat tempTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static SimpleDateFormat excelDate = new SimpleDateFormat("yyyy/MM/dd"); /** * 格式化excel中的时间 * @param date * @return */ public static String formatDateForExcelDate(Date date) { return excelDate.format(date); } /** * 将日期格式化作为文件名 * @param date * @return */ public static String formatDateForFileName(Date date) { return fileName.format(date); } /** * 格式化日期(精确到秒) * * @param date * @return */ public static String formatDateSecond(Date date) { return second.format(date); } /** * 格式化日期(精确到秒) * * @param date * @return */ public static String tempDateSecond(Date date) { return tempTime.format(date); } public static Date tempDateSecond(String str) { try { return tempTime.parse(str); } catch (ParseException e) { e.printStackTrace(); } return new Date(); } /** * 格式化日期(精确到天) * * @param date * @return */ public static String formatDateDay(Date date) { return day.format(date); } /** * 格式化日期(精确到天) * * @param date * @return */ public static String formatDateDetailDay(Date date) { return detailDay.format(date); } /** * 将double类型的数字保留两位小数(四舍五入) * * @param number * @return */ public static String formatNumber(double number) { DecimalFormat df = new DecimalFormat(); df.applyPattern("#0.00"); return df.format(number); } /** * 将字符串转换成日期 * * @param date * @return * @throws Exception */ public static Date formateDate(String date) throws Exception { return day.parse(date); } /** * 将字符日期转换成Date * @param date * @return * @throws Exception */ public static Date parseStringToDate(String date) throws Exception { return day.parse(date); } public static String formatDoubleNumber(double number) { DecimalFormat df = new DecimalFormat("#"); return df.format(number); } }
public class ConvertImageColor { Activity activity; public ConvertImageColor(Activity activity) { this.activity = activity; } // 改变图标的颜色 public Drawable changeImageColor(int drawable,int color){ Drawable myIcon = activity.getResources().getDrawable(drawable); myIcon.setColorFilter(activity.getResources().getColor(color), PorterDuff.Mode.SRC_ATOP); return myIcon; } }
public class IntentUtil {
private static final String TAG = IntentUtil.class.getSimpleName();
private static Intent intent;
private static final Object lock = new Object();
/**
*
* @Title: startActivity
*/
public static <T> void doAction(Activity activity, Class<T> class1) {
synchronized (lock) {
try {
intent = new Intent(activity, class1);
activity.startActivity(intent);
// activity.overridePendingTransition(R.anim.zoom_enter,
// R.anim.zoom_exit);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
}
/**
*
* @Title: startActivity
*/
public static <T> void doAction(Activity activity, Class<T> class1,
String key, Object object) {
synchronized (lock) {
try {
intent = new Intent(activity, class1);
if (object != null && object instanceof String) {
intent.putExtra(key, (String) object);
} else if (object != null && object instanceof Integer) {
intent.putExtra(key, (Integer) object);
}
activity.startActivity(intent);
// activity.overridePendingTransition(R.anim.zoom_enter,
// R.anim.zoom_exit);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
}
/**
*
* @Title: startActivity
*/
public static <T> void doAction(Activity activity, Class<T> class1,
HashMap<String, Serializable> map) {
synchronized (lock) {
try {
intent = new Intent(activity, class1);
if (null != map) {
Set<String> keys = map.keySet();
for (String key : keys) {
intent.putExtra(key, map.get(key));
}
activity.startActivity(intent);
// activity.overridePendingTransition(R.anim.zoom_enter,
// R.anim.zoom_exit);
}
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
}
/**
*
* @Title: startActivity
*/
public static <T> void doAction(Activity activity, Class<T> class1,
Bundle bundle) {
synchronized (lock) {
try {
intent = new Intent(activity, class1);
if (bundle != null) {
intent.putExtras(bundle);
}
activity.startActivity(intent);
// activity.overridePendingTransition(R.anim.zoom_enter,
// R.anim.zoom_exit);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
}
public static Intent getLauncherIntent() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_HOME);
return intent;
}
public static void logIntent(String tag, Intent intent) {
if (intent == null) {
return;
}
StringBuffer sb = new StringBuffer();
sb.append("\nAction:" + intent.getAction());
sb.append("\nData:" + intent.getData());
sb.append("\nDataStr:" + intent.getDataString());
sb.append("\nScheme:" + intent.getScheme());
sb.append("\nType:" + intent.getType());
Bundle extras = intent.getExtras();
if (extras != null && !extras.isEmpty()) {
for (String key : extras.keySet()) {
Object value = extras.get(key);
sb.append("\nEXTRA: {" + key + "::" + value + "}");
}
} else {
sb.append("\nNO EXTRAS");
}
Log.i(tag, sb.toString());
}
public static int sdkVersion() {
return new Integer(Build.VERSION.SDK).intValue();
}
public static void startDialer(Context context, String phoneNumber) {
try {
Intent dial = new Intent();
dial.setAction(Intent.ACTION_DIAL);
dial.setData(Uri.parse("tel:" + phoneNumber));
context.startActivity(dial);
} catch (Exception ex) {
Log.e(TAG, "Error starting phone dialer intent.", ex);
Toast.makeText(context,
"Sorry, we couldn't find any app to place a phone call!",
Toast.LENGTH_SHORT).show();
}
}
public static void startSmsIntent(Context context, String phoneNumber) {
try {
Uri uri = Uri.parse("sms:" + phoneNumber);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra("address", phoneNumber);
intent.setType("vnd.android-dir/mms-sms");
context.startActivity(intent);
} catch (Exception ex) {
Log.e(TAG, "Error starting sms intent.", ex);
Toast.makeText(context,
"Sorry, we couldn't find any app to send an SMS!",
Toast.LENGTH_SHORT).show();
}
}
public static void startEmailIntent(Context context, String emailAddress) {
try {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL,
new String[]{emailAddress});
context.startActivity(intent);
} catch (Exception ex) {
Log.e(TAG, "Error starting email intent.", ex);
Toast.makeText(context,
"Sorry, we couldn't find any app for sending emails!",
Toast.LENGTH_SHORT).show();
}
}
public static void startWebIntent(Context context, String url) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
context.startActivity(intent);
} catch (Exception ex) {
Log.e(TAG, "Error starting url intent.", ex);
Toast.makeText(context,
"Sorry, we couldn't find any app for viewing this url!",
Toast.LENGTH_SHORT).show();
}
}
}