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
相关产品推荐
相关产品推荐

