SimpleDateFormat做严格时间格式校验

须特别注意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;
}

版权声明:本文为WZH577原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。