在開發Spring Boot應用時,很多時候需要在返回的JSON數據中以特定格式顯示日期和時間。例如,使用LocalDateTime
、Date
等類型的字段時,默認的序列化格式可能不是你期望的路徑。本文將介紹如何在Spring Boot中實現控制返回JSON數據的日期格式,主要圍繞@JsonFormat
進行講解。
1. 為什么需要控制JSON中的日期格式?
默認情況下,Spring Boot(基于Jackson)會按照Jackson的默認配置將日期字段序列化成類似"yyyy-MM-dd'T'HH:mm:ss"
的格式。這在某些場景下可能不符合業務要求,或者在前端展示時需要特定的格式。
示例:
{"name": "張三","createTime": "2025-06-17T15:20:30"
}
如果你希望日期顯示為"yyyy-MM-dd HH:mm:ss"
形式,比如"2025-06-17 15:20:30"
,那么就需要自定義格式。
2. 方案一:在字段上使用@JsonFormat
這是最常用的做法。只需要在日期字段上添加注解,指定格式:
public class User {private String name;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;// getters and setters
}
效果:
{"name": "張三","createTime": "2025-06-17 15:20:30"
}
3. 方案二:全局配置ObjectMapper
如果項目中大量日期字段都要統一格式,建議配置全局的ObjectMapper
。
示例:
@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();// 設置全局日期格式mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));return mapper;}
}
這會影響整個應用的所有日期序列化行為。
4. 什么時候用@JsonFormat
,什么時候用@DateTimeFormat
?
場景 | 使用的注解 | 作用范圍 |
---|---|---|
請求參數綁定(例如:請求中日期字符串轉換為Java對象的字段) | @DateTimeFormat | 控制請求參數到Java對象的綁定規則 |
JSON序列化/反序列化(返回響應的JSON格式控制) | @JsonFormat | 控制序列化輸出的日期格式 |
總結:返回JSON數據時,主要用@JsonFormat
。
5. 具體示例:完整的控制器和實體類
import com.fasterxml.jackson.annotation.JsonFormat;public class User {private String name;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;// constructors, getters, setters
}
@RestController
public class UserController {@GetMapping("/user")public User getUser() {User user = new User();user.setName("張三");user.setCreateTime(LocalDateTime.now());return user; // 返回的JSON時間會按照@JsonFormat指定的格式輸出}
}
6. 結語
在Spring Boot中控制返回JSON的日期格式,使用@JsonFormat
是最直接、最常用的方法。結合全局配置或者字段配置,可以滿足大部分業務需求。
如果你的應用還需要更復雜的日期格式化策略,比如地域性、時區等,也可以在@JsonFormat
中加入timezone
參數,例如:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
7. 提示
- 不建議只依賴
@DateTimeFormat
來控制JSON輸出,它只對請求參數綁定起作用。 - 全局配置應慎用,避免不同模塊的格式不一致。