一、背景:
在写程序的时候,当你拿到一个时间字符串,你是否厌倦每次都需要写一个解析字符串的格式串,new一个SimpleDateFormat对象;也许你说你已经提出一个方法,根据参数(dateString,formatString)就可以返回一个date对象,你是不是还没发现每次你都需要去关注你的时间字符串是什么格式的(yyyy-MM-dd还是yyyy.MM.dd),假如你写框架时,不知道用户会用什么样的时间格式串,你是不是就觉得山穷水尽了,现在就给你呈现一个自动识别时间串转时间类型的小工具;
二、解决方案:
1、创建一个时间格式串模板,把常用的时间格式放入模板中,他相当于一个资料库;
<span style="font-size:10px;">/**
* 时间转换匹配类库
* @author 100277
*
*/
public class DateFormatTemplate {
public static List<String> formatSet = new ArrayList<String>();
static{
formatSet.add("yyyy-MM-dd'T'HH:mm:ss.SSS");
formatSet.add("yyyy-MM-dd HH:mm:ss.SSS");
formatSet.add("yyyy-MM-dd'T'HH:mm:ss");
formatSet.add("yyyy-MM-dd HH:mm:ss");
formatSet.add("yyyy-MM-dd HH:mm");
formatSet.add("yyyy-MM-dd");
formatSet.add("MM-dd");
}
}</span>
2、创建一个方法Date praseDate(String dateTime),循环去模板中取出格式匹配串进行转换;3、如果转换发生异常,则继续往下找,当转换成功时,则表示匹配成功,跳出循环,输出转换后的Date类型;
4、如果模板中的所有格式都匹配完还没批匹配成功,则表示你的资料库不全哦;
5、发现你的资料库不全时,你就完善你的资料库,这样日积月累下去,你的这个时间小工具就无所不能了;
/**
* 提供转换字符串自动解析转换时间的方法
* @author
*
*/
public class DatePraseUtil {
/**
* 给定转换的时间串,自动到匹配库中查找可匹配的模板
* @param dateTime
* @return 未找到匹配项返回null
*/
public static Date praseDate(String dateTime){
dateTime = dateTime.replaceAll("\\.", "\\-").replaceAll("\\/", "\\-");
for(String fomat:DateFormatTemplate.formatSet){
Date target = praseDate(dateTime, fomat);
if(target!=null){
return target;
}
}
return null;
}
/**
* string转date
* @param time 时间字符串
* @param fomatStr 转换模板
* @return 返回转换后的date,如果未成功,返回null
*/
public static Date praseDate(String time,String fomatStr){
SimpleDateFormat sdf = new SimpleDateFormat(fomatStr);
Date dateTime = null;
try {
dateTime = sdf.parse(time);
} catch (ParseException e) {
return null;
}
return dateTime;
}
}
注:模板中的排序是按照精度从高到低排序的,这样能保证最高精度的匹配转换