问题引入
如果不配置日期格式转换器,那么默认可以自动转换“2012/12/23”这种格式的日期。
但是无法转换"2012-12-23"这种格式的日期,会报错:
问题解决
所以我们需要自定义一个日期转换器来处理问题。
自定义日期格式转换器的步骤如下:
- 第一步,定义转换器类实现Converter接口
需要一个类实现Converter<S,T>接口,其中泛型中前者表示原数据类型,也就是输入的数据类型,而后者表示要转换成的新数据类型,比如说将一个日期字符串转换成一个Date类型。
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
// 其中s是输入的原数据类型
//将日期字符串转换成日期对象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
- 第二步,在springmvc的配置文件spring-mvc.xml中声明转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.demo.converter.DateConverter"/>
</list>
</property>
</bean>
- 第三步,在<annotation-driven>中引用转换器
<mvc:annotation-driven conversion-service="conversionService" />
- 第四步,进行测试
@RequestMapping("quick19")
@ResponseBody
public String save19(Date date){
return date.toString();
}
测试,浏览器页面输入一个日期(无论POST还是GET提交方式都能转换日期成功)
拓展
但是自定义格式转换器后,会发现一个新的问题,就是以前默认的"2021/12/23"日期格式无法转换成功,即自定义的日期格式转换器覆盖了原来默认的日期格式转换器。
那么如果我们想要输入“2012/12/23”这种格式怎么办?
解决办法就是在自定义的日期格式转换器中对输入的日期字符串进行判断,来可以传入不同格式的日期字符串。
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
// 其中s是输入的原数据类型
//将日期字符串转换成日期对象 返回
String pattern = "yyyy-MM-dd";
if (s.contains("-")) {
pattern = "yyyy-MM-dd";
} else if (s.contains("/")) {
pattern = "yyyy/MM/dd";
} else if (s.contains("年") && s.contains("月") && s.contains("日")) {
pattern = "yyyy年MM月dd日";
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date date = null;
try {
date = format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
这样就可以同时输入"2012-12-23"、"2012/12/23"和"2012年12月23日"这样格式的日期字符串了。