这一次的教训源于我们工具类里的一个方法,我们前端传了2018-05-01给我,我后端需要的参数只是2018-05,结果没有拦住!
查询结果与预期结果不符!下面是工具类的方法。
/**
* <pre>
* 检查入参是否为合法的年月字符串。
* @param inDate 格式为yyyy-MM
* @return
* </pre>
*/
public static boolean isValidYearMonth(String inDate) {
SimpleDateFormat sdf = new SimpleDateFormat(yearMonthPattern);
sdf.setLenient(false);
try {
sdf.parse(inDate);
} catch (ParseException e) {
return false;
}
return true;
}
然后我们用测试方法
public void checkDate(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");
String time ="2018-05-01";
try {
System.out.println(sdf.parse(time));
} catch (ParseException e) {
e.printStackTrace();
}
}
按照预期结果,他应该抛异常才对,因为我传的是yyyy-MM-dd 格式的字符串,然而,结果确实!正确通过!
正确解析了!2018-05-01
非常的坑!我一度怀疑是不是环境出BUG了!
我们大胆的猜想他会默认截取符合他规则的那一部分的数据,也就是说我要解析 yyyy-MM 格式的时间,他会从我字符串 2018-05-01 截取符合规则的 2018-05 来解析。获取data.他只会保证yyyy-MM这一块的精度,其他的不管。我们可以进一步检验一下猜想
public void checkDate(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");
String time ="2018-06-25";
try {
System.out.println(sdf.parse(time));
} catch (ParseException e) {
e.printStackTrace();
}
}
结果是2018-06-01 。 25日已被舍去。
再来看看相反的例子,我定义的格式比参数更长会怎么样!
public void checkDate2() throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String time ="2018-05";
try {
System.out.println(sdf.parse(time));
} catch (ParseException e) {
e.printStackTrace();
}
}
报错了!他不能识别,精度不够。
总结一下:SimpleDateFormat 可以解析 长于他定义的时间精度,只能保证他定义的时间精度,之后的则会被省略!