Spring MVC中自定义日期类型格式转换器

在Spring MVC中,自定义日期类型格式转换器可以通过实现Converter接口或使用@DateTimeFormat注解。以下是两种方法的详细说明:


方法一:全局自定义转换器(推荐)

1. 创建日期转换器类

实现 org.springframework.core.convert.converter.Converter 接口:

java 复制代码
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateConverter implements Converter<String, Date> {

    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    @Override
    public Date convert(String source) {
        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
        try {
            return format.parse(source);
        } catch (ParseException e) {
            throw new IllegalArgumentException("日期格式错误,请使用 " + DATE_FORMAT, e);
        }
    }
}
2. 注册转换器到Spring容器
方法1:通过配置类实现 WebMvcConfigurer
java 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToDateConverter());
    }
}
方法2:通过配置applicationContex.xml实现:
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 1. 声明自定义转换器 -->
    <bean id="stringToDateConverter" class="com.example.converter.StringToDateConverter"/>

    <!-- 2. 配置 ConversionService -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="stringToDateConverter"/>
                <!-- 可添加其他转换器,如日期转字符串 -->
            </set>
        </property>
    </bean>

    <!-- 3. 启用 MVC 注解驱动并关联 ConversionService -->
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!-- 其他配置(如组件扫描、视图解析器等) -->
    <context:component-scan base-package="com.example.controller"/>
</beans>

方法二:局部使用 @DateTimeFormat

直接在实体类字段上标注日期格式:

java 复制代码
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

public class MyEntity {

    @DateTimeFormat(pattern = "yyyy/MM/dd")
    private Date createTime;

    // Getter & Setter
}

使用 Java 8 的 DateTimeFormatter(更安全)

如果使用Java 8+,建议用 DateTimeFormatter 替代 SimpleDateFormat

java 复制代码
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {

    private static final DateTimeFormatter FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public LocalDateTime convert(String source) {
        return LocalDateTime.parse(source, FORMATTER);
    }
}

注册方式与全局转换器相同。


注意事项:

  1. 时区处理:如果涉及跨时区,需在格式化时指定时区:

    java 复制代码
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        .withZone(ZoneId.systemDefault());
  2. 异常处理 :转换失败时会抛出 IllegalArgumentException,可在Controller中捕获并处理。

  3. 多格式支持:若需支持多种格式,可在转换器中按顺序尝试不同格式。


通过以上步骤,即可实现全局或局部的日期格式自定义转换。

相关推荐
独自破碎E10 小时前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder10 小时前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
xdpcxq102910 小时前
风控场景下超高并发频次计算服务
java·服务器·网络
想用offer打牌10 小时前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
橘色的狸花猫10 小时前
简历与岗位要求相似度分析系统
java·nlp
独自破碎E11 小时前
Leetcode1438绝对值不超过限制的最长连续子数组
java·开发语言·算法
用户917439653911 小时前
Elasticsearch Percolate Query使用优化案例-从2000到500ms
java·大数据·elasticsearch
yaoxin52112311 小时前
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()
java·开发语言
坚持学习前端日记11 小时前
2025年的个人和学习年度总结以及未来期望
java·学习·程序人生·职场和发展·创业创新
Cosmoshhhyyy11 小时前
《Effective Java》解读第29条:优先考虑泛型
java·开发语言