SpringBoot中全局日期格式化的三种核心方案

 更新时间:2026年11月05日 09:03:40   作者:Best_Liu~  
本文系统讲解SpringBoot中统一处理日期格式的三种核心方案:@JsonFormat注解(字段级)、全局Converter(接收端)、Jackson全局配置(收发双向),并对比其适用场景与优先级,需要的朋友可以参考下

前端传个"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注解(最简单)

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

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的转换:

@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,同时控制序列化和反序列化,一劳永逸:

@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代码都不用动:

# 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或接口文档里,别靠口头约定。

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

以上就是SpringBoot中全局日期格式化的三种核心方案的详细内容,更多关于SpringBoot全局日期格式化方案的资料请关注脚本之家其它相关文章!

相关文章

  • Java HashTable与Collections.synchronizedMap源码深入解析

    Java HashTable与Collections.synchronizedMap源码深入解析

    HashTable是jdk 1.0中引入的产物,基本上现在很少使用了,但是会在面试中经常被问到。本文就来带大家一起深入了解一下Hashtable,需要的可以参考一下
    2022-11-11
  • SpringBoot rabbitmq长链接及域名TTL多机房切换配置重连能力(完整配置方案)

    SpringBoot rabbitmq长链接及域名TTL多机房切换配置重连能力(完整配置方案)

    本文介绍了在SpringBoot中配置RabbitMQ以解决长连接稳定性、域名TTL问题及机房切换后的自动重连能力的完整配置方案,通过优化连接工厂参数、刷新DNS缓存和增强重连策略,确保RabbitMQ在各种网络环境下稳定运行,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • IDEA实现java远程调试全过程

    IDEA实现java远程调试全过程

    文章主要介绍了如何在IntelliJ IDEA中配置远程调试参数,包括transport、server、suspend、address等选项的含义和作用,以及如何配置服务器防火墙以支持远程调试
    2025-11-11
  • Java中PreparedStatement的用法解析

    Java中PreparedStatement的用法解析

    这篇文章主要介绍了Java中PreparedStatement的用法解析,在JDBC应用中,PreparedStatement是一种比Statement更好的选择,PreparedStatement可以通过使用参数化查询来避免SQL注入攻击,并且可以提高查询性能,需要的朋友可以参考下
    2023-09-09
  • 深入了解SparkSQL的运用及方法

    深入了解SparkSQL的运用及方法

    SparkSQL就是将SQL转换成一个任务,提交到集群上运行,类似于Hive的执行方式。本文给大家分享了SparkSQl的运用及方法,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • 一文带你快速了解java中的static关键词

    一文带你快速了解java中的static关键词

    这篇文章主要给大家介绍了关于java中static关键词的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • springBoot连接远程Redis连接失败的问题解决

    springBoot连接远程Redis连接失败的问题解决

    本文主要介绍了springBoot连接远程Redis连接失败的问题解决,使用springboot里面的redisTemplate进行连接的时候,却发生了报错,下面就来一起解决一下
    2024-05-05
  • Spring boot 连接多数据源过程详解

    Spring boot 连接多数据源过程详解

    这篇文章主要介绍了Spring boot 连接多数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • JAVA中ArrayList和数组的转换与遇到的问题解决

    JAVA中ArrayList和数组的转换与遇到的问题解决

    做研发的朋友都知道,在项目开发中经常会碰到ArrayList与数组类型之间的相互转换,这篇文章主要给大家介绍了关于JAVA中ArrayList和数组的转换与遇到的问题解决,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • springboot整合规则引擎(liteflow)使用方式

    springboot整合规则引擎(liteflow)使用方式

    这篇文章主要介绍了springboot整合规则引擎(liteflow)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07

最新评论