You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中GET请求Date参数时间部分被截断问题咨询

问题原因

你配置的FormattingConversionService中,DateFormatterRegistrar注册了格式为yyyy-MM-dd的DateFormatter。Spring处理java.util.Date类型参数时,会优先使用这个DateFormatter,而非DateTimeFormatterRegistrar中配置的日期时间格式,导致无论传入的参数是否带时间部分,都会被按纯日期格式解析,最终时间部分被截断为00:00:00。

解决方案

方案一:移除冗余的DateFormatterRegistrar配置

删掉DateFormatterRegistrar相关代码,让DateTimeFormatterRegistrar处理所有日期时间转换,调整后的配置如下:

@Bean
public FormattingConversionService mvcConversionService() {
    DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

    DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
    dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    // 适配ISO标准的带T分隔符的日期时间格式
    dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
    dateTimeRegistrar.registerFormatters(conversionService);

    return conversionService;
}

方案二:同时兼容两种日期时间格式

如果需要同时支持2017-05-04T12:08:56和2017-05-04 12:08:56两种格式,可给DateTimeFormatterRegistrar注册多个格式:

@Bean
public FormattingConversionService mvcConversionService() {
    DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

    DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
    dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    // 注册多种日期时间格式
    dateTimeRegistrar.setDateTimeFormatters(
        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"),
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    );
    dateTimeRegistrar.registerFormatters(conversionService);

    return conversionService;
}

方案三:配合实体类注解强化解析规则(可选)

在AccessRequestParams的since字段上添加@DateTimeFormat注解,明确指定解析格式,避免全局配置变动影响字段解析:

public class AccessRequestParams {
    // 指定支持ISO标准日期时间格式
    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    Date since = null;

    // getter、setter方法省略
}

也可直接使用ISO标准注解简化配置:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
Date since = null;

内容的提问来源于stack exchange,提问作者Tobia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:20:21