主要区别
1. 所属框架不同
@JsonFormat:属于 Jackson 框架,用于 JSON 序列化/反序列化@DateTimeFormat:属于 Spring 框架,用于 HTTP 请求参数绑定
2. 使用场景不同
@JsonFormat 使用场景:
- JSON 响应输出:当对象转换为 JSON 返回给前端时
- JSON 请求解析:当接收 JSON 格式的请求体时
- API 接口的响应格式化
// 你的代码示例:ScenarioInfoVo.java
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate startTime; // 返回JSON时格式化为 "2024-01-15"
@DateTimeFormat 使用场景:
- URL 参数绑定:
@RequestParam参数 - 表单数据绑定:
@ModelAttribute对象 - 路径变量绑定:
@PathVariable参数
// 你的代码示例:ApisFlightReq.java
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDt; // 接收URL参数 ?startDt=2024-01-15
3. 典型使用对比
同时使用两个注解的情况:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat("yyyy-MM-dd")
private LocalDateTime effePeriodStart;
这样配置的原因:
@JsonFormat:处理 JSON 序列化/反序列化(API 响应和请求体)@DateTimeFormat:处理表单提交或 URL 参数绑定
4. 实际应用场景
场景1:API 响应(只需要 @JsonFormat)
@RestController
public class UserController {
@GetMapping("/user")
public UserVo getUser() {
// 返回的JSON中日期会按@JsonFormat格式化
return userVo;
}
}
@Data
public class UserVo {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime; // 输出: "2024-01-15 10:30:00"
}
场景2:URL参数接收(只需要 @DateTimeFormat)
@RestController
public class ReportController {
@GetMapping("/report")
public void getReport(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
// 接收URL参数: /report?date=2024-01-15
}
}
场景3:表单对象绑定(只需要 @DateTimeFormat)
@Data
public class SearchForm {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDate; // 表单字段: <input name="startDate" value="2024-01-15">
}
场景4:同时处理JSON和表单(需要两个注解)
@Data
public class FlightRequest {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 处理JSON
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 处理表单/URL参数
private LocalDateTime departureTime;
}
5. 选择建议
- 纯API项目(只有JSON交互):主要使用
@JsonFormat - 传统Web项目(有表单提交):主要使用
@DateTimeFormat - 混合项目:根据具体字段的使用场景选择,或者两个都加
6. 常见错误
❌ 错误用法:
// 在接收URL参数时只用@JsonFormat
@GetMapping("/search")
public void search(@RequestParam @JsonFormat(pattern = "yyyy-MM-dd") LocalDate date) {
// 这样不会生效,应该用@DateTimeFormat
}
✅ 正确用法:
@GetMapping("/search")
public void search(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
// 正确处理URL参数
}
总结:
@JsonFormat 管JSON,@DateTimeFormat 管参数绑定,根据数据的来源和去向选择合适的注解,并且被修饰的属性可以不传或者为null(前提没有被javax系列注解:@NotNull修饰)
@JsonFormat只适用于JSON交互,只能在post请求体中修饰Date系列属性。
@DateTimeFormat 适用于JSON交互+表单,get请求、post请求都可以使用它来修饰Date系列时间属性。




5万+

被折叠的 条评论
为什么被折叠?



