1. 概述
本教程將演示如何在 Spring Boot 應用程序中格式化 JSON 日期字段。
我們將探索使用 Jackson 的各種方法,用於格式化日期,而 Spring Boot 默認使用 Jackson 作為其 JSON 處理器。
2. 使用 @JsonFormat 在 Date 字段上
2.1. 設置格式
我們可以使用@JsonFormat註解來格式化特定字段:
public class Contact {
// other fields
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastUpdate;
// standard getters and setters
}在 生日 字段中,我們使用一種渲染僅顯示日期的模式,而在 最後更新 字段中,我們還包含時間。
我們使用了 Java 8 日期類型,這些類型對於處理時間類型非常方便。
當然,如果我們需要使用遺留類型,如 java.util.Date,我們可以使用相同的註解:
public class ContactWithJavaUtilDate {
// other fields
@JsonFormat(pattern="yyyy-MM-dd")
private Date birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date lastUpdate;
// standard getters and setters
}最後,讓我們來看一下使用帶有給定日期格式的<em>@JsonFormat</em>生成的輸出:
{
"birthday": "2019-02-03",
"lastUpdate": "2019-02-03 10:08:02"
}如我們所見,使用 @JsonFormat 註解是一種格式化特定日期字段的絕佳方法。
但是,我們只應在需要為特定字段進行格式化時使用它。 如果我們希望在應用程序中對所有日期採用通用的格式,則有更好的方法可以實現這一點,我們稍後將看到。
2.2. 設置時區
如果需要使用特定的時區,我們可以設置 <em>JsonFormat</em> 屬性中的 <em>timezone</em> 屬性:
@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 的日期類型,例如 LocalDate 和 LocalDateTime。我們只能將其用於格式化 java.util.Date 或 java.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)));
};
}
}上述示例展示瞭如何在我們的應用程序中配置默認格式。我們需要定義一個 Bean 並覆蓋其 customize 方法來設置所需的格式。
儘管這種方法看起來有些繁瑣,但它既適用於 Java 8 及其舊版本的日期類型。
結論
在本文中,我們探討了在 Spring Boot 應用程序中格式化 JSON 日期的多種方法。