1、概览 {#1概览}
本文将带你了解如何在 Spring Boot 应用中格式化 JSON Date
字段。
Spring Boot 默认使用 Jackson 作为 JSON 的序列化/反序列化框架。
2、在 Date 字段上使用 @JsonFormat {#2在-date-字段上使用-jsonformat}
2.1、设置格式化 {#21设置格式化}
我们可以使用 @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、设置时区 {#22设置时区}
如果需要使用特定的时区,可以设置 @JsonFormat
注解的 timezone
属性:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;
如果一个类型已经包含时区,例如 java.time.ZonedDatetime
,就不需要使用它。
3、设置默认的格式化格式 {#3设置默认的格式化格式}
如前所述,@JsonFormat
本身功能强大,但硬编码格式和时区会显得不够灵活。
如果想为应用中的所有日期配置默认格式,更灵活的方法是在 application.properties
中进行配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
如果想在 JSON 日期中使用特定的时区,也有相应的属性:
spring.jackson.time-zone=Europe/Zagreb
虽然这样设置默认格式既方便又直接,但这种方法也有缺点,它不适用于 Java 8 的日期类型,如 LocalDate
和 LocalDateTime
。我们只能用它来格式化 java.util.Date
或 java.util.Calendar
类型的字段。
4、自定义 Jackson ObjectMapper {#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、总结 {#5总结}
本文介绍了在 Spring Boot 应用中设置日期 JSON 格式化的多种方法。
Ref:https://www.baeldung.com/spring-boot-formatting-json-dates