String 转java.util.Date的一般做法是这个样子滴
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Date date = sdf.parse("2012-12-06 ");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd ");
Date date = sdf2.parse("2012/12/06 ");
如果要解析 2012年12月06日
那是不是要把模式改成 yyyy年MM月dd日
??是不是很麻烦
那么问题来了, 如何做个比较通用的解析方法呢?
有些同学说可以多定义几种匹配模式, 给大家演示基本做法
private static final String[] pattern = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss" };
public static Date parseDate(String source) {
for (int i = 0; i < pattern.length; i++) {
try {
return new SimpleDateFormat(pattern[i]).parse(source);
} catch (ParseException e) {}
}
return null;
}
办法倒是可行,可还是面临两个问题
- 就是当解析失败时(抛出异常)再用另外一个模式进行匹配,直到解析成功. 同学们, 异常啊,注意是异常, 要抛多少次啊,我的天那!!!
- 这么多模式,你匹配的完吗??不现实啊,对不对
下面是一个比较通用的解析方式
public static Date parseDate(String source) {
if(source == null || source.isEmpty()) return null;
int index = 0;
StringBuffer pattern = new StringBuffer();
char[] chars = source.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (Character.isDigit(chars[i])) {
switch (index) {
case 0:
pattern.append("y");
break;
case 1:
pattern.append("M");
break;
case 2:
pattern.append("d");
break;
case 3:
pattern.append("H");
break;
case 4:
pattern.append("m");
break;
case 5:
pattern.append("s");
break;
case 6:
pattern.append("S");
break;
}
} else{
pattern.append(chars[i]);
index++;
}
}
try {
return new SimpleDateFormat(pattern.toString()).parse(source);
} catch (ParseException e) {
return null;
}
}
测试下
parseDate("2016年12月11日");
parseDate("16年2月11日")
parseDate("16年2月11日11点22分")
parseDate("16-2-11 11点22分50秒")
parseDate("016/2_11/11/22/50")
parseDate("2016/02/11日 11-22-50")
parseDate("2016/02/11添加干扰文字试试"); //依然可以匹配成功
嗯就是这样,根据数字解析出模式. 有没有焕然一新的感觉