在开发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 {
@Bean
public 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输出,它只对请求参数绑定起作用。 - 全局配置应慎用,避免不同模块的格式不一致。