记一次SimpleDateFormat的坑,错误的格式竟然不抛异常!

这一次的教训源于我们工具类里的一个方法,我们前端传了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 可以解析 长于他定义的时间精度,只能保证他定义的时间精度,之后的则会被省略! 

猜你喜欢

转载自blog.csdn.net/qq_36328170/article/details/80248876