SpringMVC自定义处理多种日期格式的格式转换器

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC自定义处理多种日期格式的格式转换器相关的知识,希望对你有一定的参考价值。

问题引入

如果不配置日期格式转换器,那么默认可以自动转换“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日"这样格式的日期字符串了。

以上是关于SpringMVC自定义处理多种日期格式的格式转换器的主要内容,如果未能解决你的问题,请参考以下文章

Django中的日期处理注意事项和自定义时间格式转换

如何在 Java 中解析自定义的多种日期格式

日期格式化

DataTime日期格式化

js时间戳怎么转成日期格式

使用ivx实现日期格式转换的经验总结