全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

日期类型转换进阶

深入探讨SpringMVC日期类型转换的高级配置与自定义实现。

自定义转换器

实现Converter接口创建自定义转换器:

Java
public class StringToDateConverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return sdf.parse(source);
        } catch (ParseException e) {
            throw new IllegalArgumentException("日期格式错误");
        }
    }
}

注册转换器

Java
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToDateConverter());
    }
}

多日期格式支持

支持多种日期格式转换:

Java
public class MultiFormatDateConverter implements Converter<String, Date> {

    private static final String[] FORMATS = {
        "yyyy-MM-dd",
        "yyyy/MM/dd",
        "yyyy-MM-dd HH:mm:ss",
        "yyyy年MM月dd日"
    };

    @Override
    public Date convert(String source) {
        for (String format : FORMATS) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                sdf.setLenient(false);
                return sdf.parse(source);
            } catch (ParseException ignored) {
            }
        }
        throw new IllegalArgumentException("无法解析日期: " + source);
    }
}

格式化注解

使用@DateTimeFormat指定格式:

Java
public class Event {
    private Integer id;
    private String name;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date eventDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

JSON日期格式

返回JSON时的日期格式化:

使用JsonFormat

Java
public class User {
    private Integer id;
    private String name;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}

全局配置

Java
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
            builder.timeZone(TimeZone.getTimeZone("GMT+8"));
        };
    }
}

类型转换器工厂

使用ConverterFactory批量转换:

Java
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum<?>> {

    @Override
    public <T extends Enum<?>> Converter<String, T> getConverter(Class<T> targetType) {
        return source -> (T) Enum.valueOf(targetType, source.toUpperCase());
    }
}

属性编辑器

传统方式使用PropertyEditor:

Java
@Controller
public class DateController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }
}
方式适用场景
Converter全局类型转换
@DateTimeFormat单字段格式化
@JsonFormatJSON序列化格式化
PropertyEditor控制器级别配置

要点总结

  • Converter:全局类型转换,推荐使用
  • @DateTimeFormat:请求参数绑定时的日期格式
  • @JsonFormat:JSON响应时的日期格式
  • 支持多格式解析,提高容错性

📝 发现内容有误?点击此处直接编辑

← 上一篇 日期类型转换基础
下一篇 → 请求头与Cookie
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库