别再搞混了!@DateTimeFormat 和 @JsonFormat 到底有什么区别?

在日常开发中,时间格式的处理是一个常见但容易出错的问题。尤其是在前后端交互时,前端传过来的时间字符串和后端返回的时间格式往往需要做特定的处理。这时候,Spring 提供的 @DateTimeFormat和 Jackson 提供的 @JsonFormat注解就显得尤为重要。然而,很多开发者对这两者的区别和适用场景并不清晰,今天我们就来详细解析一下。


1. @DateTimeFormat注解

@DateTimeFormat是 Spring 框架提供的一个注解,主要用于处理 前端传到后端 的时间字符串格式化问题。它通常用于 Controller 层的参数绑定,将前端传递的字符串转换为 Java 的日期类型(如 DateLocalDateTime等)。

使用场景:

  • 前端通过表单或 URL 参数传递时间字符串,后端需要将其转换为日期对象。
  • 适用于 @RequestParam@ModelAttribute绑定的场景。

示例代码:

@PostMapping("/user")
public String createUser(@RequestParam("birthday") 
                         @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
    // 处理逻辑
    return "success";
}

在这个例子中,前端传递的 birthday参数会被 Spring 按照 yyyy-MM-dd的格式解析为 Date类型。


2. @JsonFormat注解

@JsonFormat是 Jackson 库提供的注解,主要用于处理 后端返回给前端 的时间格式化问题,或者在反序列化时将 JSON 字符串中的时间转换为 Java 日期类型。它通常用于实体类的字段上,控制日期在 JSON 序列化和反序列化时的格式。

使用场景:

  • 后端返回 JSON 数据时,将日期类型格式化为指定的字符串。
  • 反序列化时,将 JSON 中的时间字符串转换为日期对象。

示例代码:

public class User {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

    // getter 和 setter
}

在这个例子中,createTime字段在序列化为 JSON 时会按照 yyyy-MM-dd HH:mm:ss的格式输出,并且在反序列化时也会按照相同的格式解析。


3. 两者的区别

虽然 @DateTimeFormat@JsonFormat都用于处理时间格式,但它们的适用场景和底层实现完全不同:

特性 @DateTimeFormat @JsonFormat
所属框架 Spring Jackson
主要用途 请求参数绑定(字符串 -> 日期) JSON 序列化与反序列化
适用场景 前端传到后端的时间格式化 后端返回前端或 JSON 处理时的格式化
支持类型 Date、LocalDateTime 等 Date、LocalDateTime 等
时区处理 依赖系统默认时区 可以通过 timezone属性指定时区






次阅读

扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论