Spring4.x升级到5.x后yyyy-MM-dd'T'HH:mm:ssZZ格式日期输出异常如何解决
问题根因
- 你使用的
DateFormatUtils.formatUTC方法来自Apache Commons Lang3,该工具包3.5及以上版本对ZZ格式符的输出逻辑做了调整:UTC零时区下,旧版本输出+00:00,新版本输出简化标识Z。如果Spring 5.x升级过程中顺带提升了commons-lang3的依赖版本,就会触发该格式差异。 - Spring 5.x默认绑定Jackson 2.10+作为JSON序列化组件,默认对
java.util.Date类型的ISO8601序列化规则调整为:UTC零时区输出Z而非+00:00。如果你的reportedDate字段没有走自定义的DateFormatUtils格式化逻辑,而是直接由Spring MVC消息转换器自动序列化返回,也会出现格式不一致的问题。
解决方案
你可以根据实际业务场景选择以下任意一种方案:
方案1:调整自定义格式化的日期模式(适合手动格式化字段的场景)
直接将格式符从ZZ替换为XXX即可,XXX在UTC零时区下会固定输出+00:00,完全匹配Spring 4.x的输出格式。修改后代码如下:this.probReportCreationDate = DateFormatUtils.formatUTC(probReportCreationDate, "yyyy-MM-dd'T'HH:mm:ssXXX");方案2:全局配置Spring Jackson序列化规则(适合字段由Spring自动序列化返回的场景)
如果你的返回字段没有经过手动格式化,直接在Spring Web配置类中添加全局序列化规则即可统一所有日期字段的输出格式:
@Configuration public class JacksonDateConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { ObjectMapper objectMapper = new ObjectMapper(); // 关闭时间戳输出,启用ISO格式输出 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 设置指定日期格式,XXX对应+00:00格式的时区偏移 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")); // 固定时区为UTC,和原formatUTC逻辑对齐 objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); // 把自定义的消息转换器添加到最优先位置 converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper)); } }
- 方案3:锁定依赖版本(不推荐)
如果暂时不想修改业务代码,可以在依赖管理中将commons-lang3的版本锁定到3.4及以下,该版本的ZZ格式符仍会输出+00:00。但该方案存在安全漏洞风险,仅可作为临时过渡方案使用。
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

