须特别注意setLenient方法,默认是true宽松的格式校验,很多不符合格式的也会转换成功;
设置为false则强校验格式,不符合则转换失败
public static Date getDateByFormat(String dateStr, String format, boolean lenient){
SimpleDateFormat sft = new SimpleDateFormat(format);
//默认是true宽松的格式校验,很多不符合格式的也会转换成功;设置为false则强校验格式,不符合则转换失败
sft.setLenient(lenient);
try {
return sft.parse(dateStr);
} catch (ParseException ignored) {
}
return null;
}
public static void main(String[] args) {
//Wed Apr 11 00:00:00 CST 25
System.out.println(getDateByFormat("20-202020","yyyyMMdd",true));
//null
System.out.println(getDateByFormat("20202020","yyyyMMdd",false));
}
这样在严格校验时还是有两个个问题
public static void main(String[] args) {
//这个竟然可以解析通过
System.out.println(getDateByFormat("202202020","yyyyMMdd",false));
//这个竟然也可以解析通过
System.out.println(getDateByFormat("2022022!","yyyyMMdd",false));
}
所以将代码修改为
public static Date getDateByFormat(String dateStr, String format, boolean lenient){
//formatStrToDate("202202020","yyyyMMdd")
if(StringUtils.isBlank(dateStr) || StringUtils.isBlank(format) || dateStr.length() != format.length()){
return null;
}
//formatStrToDate("2022022.","yyyyMMdd")
if(!dateStr.matches(".*[0-9]{2}")){
return null;
}
SimpleDateFormat sft = new SimpleDateFormat(format);
//默认是true宽松的格式校验,很多不符合格式的也会转换成功;设置为false则强校验格式,不符合则转换失败
sft.setLenient(lenient);
if(!lenient){
if(dateStr.length() != format.length()){
return null;
}
}
try {
return sft.parse(dateStr);
} catch (ParseException ignored) {
}
return null;
}