@JsonFormat 和 @DateTimeFormat 使用场景和区别,一文吃透精简版!!!

主要区别

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系列时间属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值