Spring Boot 设置日期(Date/LocalDate/LocalDateTime)的 JSON 格式化

1、概览

本文将带你了解如何在 Spring Boot 应用中格式化 JSON Date 字段。

Spring Boot 默认使用 Jackson 作为 JSON 的序列化/反序列化框架。

2、在 Date 字段上使用 @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 方法省略

}

如上,用了 Java 8 的日期类型,它在处理时间类型时非常方便。birthday 字段只显示日期,而 lastUpdate 字段则包括了时间。

当然,如果需要使用 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 方法省略
}

最后,来看看使用 @JsonFormat 格式化日期字段后的输出:

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

使用 @JsonFormat 可以很方便地为不同的日期字段设置不同的格式化方式,但是如果需要一次性为系统中所有日期字段都设置格式化的格式,那么使用注解的方式就会比较麻烦。

2.2、设置时区

如果需要使用特定的时区,可以设置 @JsonFormat 注解的 timezone 属性:

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

如果一个类型已经包含时区,例如 java.time.ZonedDatetime,就不需要使用它。

3、设置默认的格式化格式

如前所述,@JsonFormat 本身功能强大,但硬编码格式和时区会显得不够灵活。

如果想为应用中的所有日期配置默认格式,更灵活的方法是在 application.properties 中进行配置:

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

如果想在 JSON 日期中使用特定的时区,也有相应的属性:

spring.jackson.time-zone=Europe/Zagreb

虽然这样设置默认格式既方便又直接,但这种方法也有缺点,它不适用于 Java 8 的日期类型,如 LocalDateLocalDateTime。我们只能用它来格式化 java.util.Datejava.util.Calendar 类型的字段。

4、自定义 Jackson ObjectMapper

如果我们想使用 Java 8 日期类型并设置默认日期格式,就需要创建一个 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)));
        };
    }

}

如上,只需要在配置类中定义 Jackson2ObjectMapperBuilderCustomizer Bean,并通过 Lambda 以编程式来配置日期的格式方式。

虽然这种方法看起来有点麻烦,但好在它既适用于 Java 8,也适用于传统的日期类型。

5、总结

本文介绍了在 Spring Boot 应用中设置日期 JSON 格式化的多种方法。


Ref:https://www.baeldung.com/spring-boot-formatting-json-dates