偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring Boot中JSON日期處理的五種騷操作

開發(fā) 前端
在項(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)。

環(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。

責(zé)任編輯:武曉燕 來源: Springboot全家桶實(shí)戰(zhàn)案例
相關(guān)推薦

2025-10-27 01:00:00

2025-02-07 09:11:04

JSON對(duì)象策略

2025-01-13 12:46:31

SpringBootJacksonJSON

2025-06-06 08:28:56

2025-07-29 04:11:00

SpringJSON數(shù)據(jù)

2024-08-30 11:11:01

2023-05-09 15:01:43

JavaScript編程語言異常處理

2025-04-30 08:39:33

SpringMVC接口

2025-01-15 12:43:23

2022-08-18 09:38:02

Spring跨域

2024-09-14 11:31:27

@AsyncSpring異步

2020-06-18 08:18:35

密碼加密安全

2025-06-30 01:45:00

2025-07-08 08:20:39

2025-06-26 01:22:00

SpringBean開發(fā)

2022-04-27 08:55:01

Spring外部化配置

2009-06-19 18:26:38

Spring事務(wù)配置

2011-02-28 13:51:30

Spring事物配置

2024-09-27 12:27:31

2011-11-25 10:25:27

SpringJava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)