@DateTimeFormat和@JsonFormat的区别

1.1 简介

@DateTimeFormat@JsonFormat都是处理时间格式化问题的,把其他类型转换成自己需要的时间类型。

1.2 @DateTimeFormat@JsonFormat详解

1.2.1 所属依赖

@DateTimeFormat@JsonFormat分别属于springjackson,所以我们需要导入相应的包。

    <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
  <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.10.6version>
  dependency>

DateTimeFormat:用于格式化参数,可将date的字符串转化为date对象,即前端向后端发送一个约定好的时间字符串 “yyyy-MM-dd hh:mm:ss”,既然是格式化参数就有两种用法,一种直接用在实体类上,一种加在参数上,如下图所示:

1.2.2 代码示例

控制器TestController

@RestController
@RequestMapping("/test")
@Validated
public class TestController {
    @GetMapping("/1")
    public void get(@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date) {
        System.out.println(date);
    }
    
    @GetMapping("/2")
    public Student get2(Student student) {
        System.out.println(student);
        return student;
    }
}

实体类Student

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
@Data
public class Student {

    private String name;
    
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date  birth;
    
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date date;
}

1.2.3 Postman测试

@DateTimeFormat和@JsonFormat的区别_第1张图片
我们可以发现birth未被解析,date被解析了,由此可见JsonFormat的作用。

需要注意的是JsonFormat只能作用在实体类上,直接作用在参数上,作用未生效,如下图。
@DateTimeFormat和@JsonFormat的区别_第2张图片

1.3 区别和相同点

总结:DateTimeFormat用于前端传参,JsonFormat用于后端向前端返回数据解析。

1.3.1 区别

来源的包不同,作用也不同:

@DateTimeFormatspring包里面的注解,作用是接收从页面传到后台的日期值;

@JsonFormatjackson包里面的注解,作用是从后台向前台传递日期值;

使用@DateTimeFormat时,前台向后台传数据,必须要使用url拼接参数的方式才生效;

1.3.2 相同点

yyyy-MM-dd HH:mm:ss代表年月日时分秒,比如:2020-11-26 16:01:01;我们需要根据实际存储的数据来定义pattern的值。

如果 pattern = “yyyy-MM-dd HH:mm:ss”,那么前端传递的必须是年月日时分秒的字符串,否则抛出异常;

如果 pattern = “yyyy-MM-dd 01:03:03”,那么前端传递的必须是带时分秒,并且是01:02:03的字符串,否则抛出异常;

如果 pattern = “yyyy-MM-dd”,前端传递的参数带不带时分秒都是可以的,并且时分秒会被格式化为00:00:00

一般我们需要什么数据,就在pattern里面定义好就可以了。

你可能感兴趣的:(Java,java,DateTimeFormat,JsonFormat,日期格式化)