SpringBoot全局日期格式化

💥 前端传个"2026-10-16 14:30:00",后端一接收直接报错400------日期格式化的痛,每个Java后端都经历过。

💥 项目里十几个实体类,每个字段都写@JsonFormat?改个格式要改十几处?维护起来想哭......

💥 今天分享3种全局日期格式化方案,从简单到高级,配完整代码,抄完直接用,再也不用手写转换了。

一、痛点回顾:日期格式为什么总出问题?

Java后端的日期处理一直是重灾区,主要问题有这几个:

✅ 前端传的是字符串"2026-10-16",后端要用LocalDate接收

✅ 前端传的是时间戳1760601600000,后端要用Date接收

✅ 后端返回给前端的日期格式不统一,有的带T,有的带时区

✅ 不同接口格式不一样,用户中心用yyyy-MM-dd,订单中心用yyyy/MM/dd

最原始的做法是在每个Controller里手动SimpleDateFormat转换,代码丑、容易出错、还没法复用。下面看3种正经方案。

二、方案一:@JsonFormat注解(最简单)

直接在实体类字段上加注解,控制序列化和反序列化格式:

java 复制代码
public class OrderDTO {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",
        timezone = "GMT+8")
    private LocalDateTime createTime;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate birthDay;
}

三、方案二:全局Converter配置(推荐)

写一个全局的Converter,统一处理前端传入的字符串到LocalDate/LocalDateTime的转换:

java 复制代码
@Configuration
public class DateConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new Converter<String, LocalDate>() {
            @Override
            public LocalDateconvert(String source) {
                return LocalDate.parse(source,
                    DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            }
        });
        registry.addConverter(new Converter<String, LocalDateTime>() {
            @Override
            public LocalDateTimeconvert(String source) {
                return LocalDateTime.parse(source,
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
        });
    }
}

**适用场景:**处理前端通过GET请求参数、表单提交传入的日期字符串。比如 /api/orders?startDate=2026-10-16 这种。

**注意:**这个方案只管"接收",不管"返回"。如果要控制返回给前端的格式,还需要配合其他方案。

四、方案三:Jackson全局配置(最全面)

直接配置Jackson的ObjectMapper,同时控制序列化和反序列化,一劳永逸:

java 复制代码
@Configuration
public class JacksonConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizercustomizer() {
        return builder -> {
            DateTimeFormatter dateFormatter =
                DateTimeFormatter.ofPattern("yyyy-MM-dd");
            DateTimeFormatter dateTimeFormatter =
                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

            // LocalDate序列化/反序列化
            builder.serializers(
                new LocalDateSerializer(dateFormatter));
            builder.deserializers(
                new LocalDateDeserializer(dateFormatter));

            // LocalDateTime序列化/反序列化
            builder.serializers(
                new LocalDateTimeSerializer(dateTimeFormatter));
            builder.deserializers(
                new LocalDateTimeDeserializer(dateTimeFormatter));
        };
    }
}

配完之后,所有接口的请求和响应都自动按统一格式处理,实体类上不用加任何注解,干净清爽。

⚠️ 注意

如果某个接口需要特殊格式,在字段上加@JsonFormat可以覆盖全局配置,优先级:字段注解 > 全局配置。

五、application.yml极简配置法

如果你只需要统一格式,不需要多格式兼容,直接在配置文件里写就行,连Java代码都不用动:

java 复制代码
# application.yml
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false

这个方案对java.util.Date类型完全生效。但对Java 8的LocalDateTime需要额外加依赖或配合方案三使用。

六、3种方案对比

对比维度 @JsonFormat注解 全局Converter Jackson全局配置
控制粒度 字段级别 全局(接收) 全局(接收+返回)
代码量 多(每个字段加) 中 少(一处配置)
灵活性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
维护性 差(改格式要全局搜) 好 最好
适用场景 格式不统一、特殊字段 GET参数/表单接收 JSON接口统一格式

七、生产环境最佳实践

✅ 统一用LocalDate/LocalDateTime,别再用java.util.Date了,线程不安全,坑多。

✅ 全局Jackson配置 + 个别字段@JsonFormat覆盖,兼顾统一性和灵活性。

✅ 时区必须明确指定,统一用GMT+8或者UTC,别依赖系统默认时区,部署到服务器上会出问题。

✅ 前后端约定好格式文档,写进Swagger或接口文档里,别靠口头约定。

✅ 时间戳方案不推荐,可读性差,调试困难,除非对接第三方系统有硬性要求。

相关推荐
小蒜学长1 小时前
基于Django+Vue喵汪联盟宠物领养系统的设计与实现(代码+数据库+LW)
后端·python·django·宠物领养系统·流程规范化
少年的范儿1 小时前
IntelliJ IDEA 配置 JDK 21 与 Maven 教程(Windows):开发环境配置与验证
java·jdk·maven·intellij idea
RuoyiOffice1 小时前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创
Dwzun1 小时前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
小码哥_常7 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设10 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw11 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号12 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨12 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端