Spring Boot中JSON日期處理的五種騷操作
環(huán)境:SpringBoot3.4.2
1. 簡(jiǎn)介
在項(xiàng)目開發(fā)中,日期格式化是數(shù)據(jù)交互的核心需求之一。無論是用戶界面展示、API接口響應(yīng),還是數(shù)據(jù)庫持久化存儲(chǔ),不同場(chǎng)景對(duì)日期格式的要求存在顯著差異:前端可能需要易讀的yyyy-MM-dd格式,數(shù)據(jù)庫存儲(chǔ)偏好TIMESTAMP類型,而跨時(shí)區(qū)系統(tǒng)則需統(tǒng)一使用ISO 8601標(biāo)準(zhǔn)(如2025-01-01T14:30:00Z)。若處理不當(dāng),易導(dǎo)致時(shí)區(qū)錯(cuò)亂、解析失敗或數(shù)據(jù)不一致等問題。如下默認(rèn)Jackson默認(rèn)日期輸出格式:
圖片
該日期格式通常不是我們希望的格式,并且默認(rèn)時(shí)區(qū)使用的是 "零時(shí)區(qū)",而對(duì)我們來說正確的是東八區(qū)(UTC+8)。
接下來,我們將系統(tǒng)梳理Spring Boot中Jackson庫的5種日期格式化方案,幫助開發(fā)者根據(jù)業(yè)務(wù)需求選擇最優(yōu)實(shí)踐。
2.實(shí)戰(zhàn)案例
環(huán)境準(zhǔn)備
public record User(Long id, String name, Date createTime) {
}
@GetMapping("/query")
public ResponseEntity<?> query() {
  return ResponseEntity.ok(new User(1L, "Pack_xg", new Date())) ;
}2.1 配置文件全局設(shè)置
在配置文件(application.yml或.properties)定義全局日期格式,統(tǒng)一處理所有日期字段。配置簡(jiǎn)單高效,適合全項(xiàng)目統(tǒng)一日期格式的場(chǎng)景,無需修改代碼。
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: "GMT+8"如上配置后,再次訪問接口
圖片
缺點(diǎn):僅支持SimpleDateFormat格式,無法針對(duì)不同字段設(shè)置不同格式,靈活性差。若項(xiàng)目中有多種日期格式需求,需結(jié)合其他方式使用。如下源碼:
圖片
2.2 @JsonFormat注解
在實(shí)體類字段上使用注解,精確控制單個(gè)字段的日期格式和時(shí)區(qū)。靈活性高,適合不同字段需要不同格式的場(chǎng)景(如生日用年月日,創(chuàng)建時(shí)間用年月日時(shí)分秒)。
public record User(
    Long id, String name, 
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") Date birthday,
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") Date createTime) {
}我們只需要在實(shí)體類中對(duì)應(yīng)的字段上使用 @JsonFormat 注解即可。
圖片
缺點(diǎn):需在每個(gè)日期字段上單獨(dú)配置,若字段較多則代碼冗余。無法動(dòng)態(tài)修改格式,硬編碼在實(shí)體類中。
2.3 自定義ObjectMapper
通過配置 Jackson2ObjectMapperBuilderCustomizer,可以設(shè)置 Jackson 默認(rèn)的日期格式,實(shí)現(xiàn)全局統(tǒng)一的日期格式輸出。這種方式適用于整個(gè)項(xiàng)目中所有日期字段需統(tǒng)一格式的情況,維護(hù)方便,適合大型項(xiàng)目使用。
@Component
public class JacksonConfig implements Jackson2ObjectMapperBuilderCustomizer {
  @Override
  public void customize(Jackson2ObjectMapperBuilder builder) {
    builder.simpleDateFormat("yyyy-MM-dd HH:mm").timeZone("GMT+8") ;
  }
}此種方式的作用域與上面的application.yml方式一樣。
圖片
缺點(diǎn):強(qiáng)制全局統(tǒng)一格式。有特殊需求的地方就必須通過 @JsonFormat 進(jìn)行修改。
2.4 使用@JsonComponent注解
通過 @JsonComponent 注解注冊(cè)一個(gè)全局的日期序列化器,可以對(duì)所有 Date 類型進(jìn)行統(tǒng)一格式化。這種方式適用于項(xiàng)目中所有日期字段都需要自定義格式,且希望集中管理格式邏輯。
@JsonComponent
public class GlobalDateSerializer extends JsonSerializer<Date> {
  @Override
  public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    gen.writeString(sdf.format(date));
  }
}針對(duì)Date類型的序列化輸出進(jìn)行處理。
圖片
2.5 @JsonSerialize + JsonSerializer
通過自定義類實(shí)現(xiàn)日期轉(zhuǎn)換邏輯。適合需要特殊日期格式(如時(shí)間戳轉(zhuǎn)特定字符串)的復(fù)雜場(chǎng)景。
public class DateSerializer extends JsonSerializer<Date> {
  @Override
  public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-19 HH:mm:ss") ;
    gen.writeString(sdf.format(date));
  }
}
public record User(
    Long id, String name, 
    Date birthday,
    @JsonSerialize(using = DateSerializer.class)
    Date createTime) {
}兩者結(jié)合實(shí)現(xiàn)高度定制化日期轉(zhuǎn)換邏輯。
圖片
缺點(diǎn):需編寫額外的序列化類,代碼量較大。維護(hù)成本高,適合特殊需求,但普通場(chǎng)景顯得過于復(fù)雜。
注:以上方式都支持Java8中的新的日期類型:LocalDate,LocalDateTime。















 
 
 















 
 
 
 