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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:02