1. 概述

在本文中,我们将介绍如何在 Spring Boot 应用中对 JSON 日期字段进行格式化。

Spring Boot 默认使用 Jackson 作为 JSON 处理器,因此我们将基于 Jackson 提供的多种方式来实现日期格式控制。

2. 使用 @JsonFormat 格式化日期字段

2.1. 设置日期格式

我们可以使用 @JsonFormat 注解来对某个字段进行特定格式的序列化:

public class Contact {

    // 其他字段省略

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate birthday;
     
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastUpdate;

    // getter/setter 省略
}

在这个例子中,birthday 字段只展示日期部分,而 lastUpdate 则包含时间信息。

我们使用了 Java 8 的日期时间 API,这类类型在处理时间语义时更加清晰和安全。

当然,如果你还在使用老的 java.util.Date 类型,也可以同样使用该注解:

public class ContactWithJavaUtilDate {

     // 其他字段省略

     @JsonFormat(pattern="yyyy-MM-dd")
     private Date birthday;
     
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date lastUpdate;

     // getter/setter 省略
}

最终输出的 JSON 内容如下所示:

{
    "birthday": "2019-02-03",
    "lastUpdate": "2019-02-03 10:08:02"
}

小结: 使用 @JsonFormat 是一种简单粗暴、针对性强的方式,适合用于个别字段的格式定制。

⚠️ 注意: 如果你需要统一整个项目中的日期格式,这种方式就显得有点“低效”了,后面我们会讲更优雅的做法。

2.2. 设置时区

如果你需要指定某个字段的时区,可以通过 @JsonFormattimezone 属性设置:

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;

⚠️ 如果字段类型本身就包含了时区信息(如 ZonedDateTime),则无需额外设置时区。

3. 配置全局默认日期格式

虽然 @JsonFormat 很方便,但硬编码格式和时区并不是长久之计。

如果想为整个应用配置统一的日期格式,可以在 application.properties 文件中进行如下配置:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

还可以设置默认时区:

spring.jackson.time-zone=Europe/Zagreb

✅ 这种方式简单直接,适用于快速统一配置。

但有一个致命缺陷: 它对 Java 8 新的时间类型(如 LocalDateLocalDateTime不生效,仅支持 java.util.Datejava.util.Calendar

4. 自定义 Jackson 的 ObjectMapper

如果我们既要使用 Java 8 时间类型,又要设置全局格式,那就要祭出终极武器了:自定义 ObjectMapper

具体做法是创建一个实现了 Jackson2ObjectMapperBuilderCustomizer 接口的 Bean:

@Configuration
public class ContactAppConfig {

    private static final String dateFormat = "yyyy-MM-dd";
    private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat(dateTimeFormat);
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }

}

这段代码展示了如何为 Java 8 时间类型设置全局格式。虽然看起来稍微啰嗦了一点,但它同时兼容新旧时间类型,非常实用。

优点总结:

  • 支持 Java 8 时间类型 ✅
  • 可控性强,可扩展性好 ✅
  • 统一管理,避免重复注解 ✅

5. 总结

在这篇文章中,我们介绍了多种在 Spring Boot 中对 JSON 日期字段进行格式化的方法:

方法 是否支持 Java 8 时间类型 是否全局生效 推荐场景
@JsonFormat 单个字段特殊格式
application.properties 快速统一旧类型格式
自定义 ObjectMapper 最佳实践,推荐使用

📌 建议: 生产环境中推荐使用自定义 ObjectMapper 的方式,既灵活又兼容性强,踩坑少。


原始标题:Formatting JSON Dates in Spring Boot | Baeldung