前后端时间传递之注解形式(@DateTimeFormat与@JsonFormat)
作者:mmseoamin日期:2023-12-18

文章目录

    • 一、前言
    • 二、前端传后端(@DateTimeFormat)
      • 2.1 场景
      • 2.2 例子
      • 三、后端传前端
        • 3.1 场景
        • 3.2 例子
        • 四、java.sql包下的Date用法
          • 4.1 说明
          • 4.2 结果测试
            • 4.2.1 swagger请求传参
            • 4.2.2 接口
            • 4.2.3 接口中用到的实体类
            • 4.2.4 返回结果

              一、前言

              在我们开发的过程中常常会遇到前后端传递时间的问题,同样笔者也是遇到了这样的问题,以前笔者的做法是在代码中转换:前端传String类型的时间,然后后端用String接收以后存入数据库时再转化为Date;返回给前端时也是一样,先从数据库中查出Date类型的数据,返回给前端时转化为String,非常麻烦。后来也是看到了用注解的方式非常方便,在这里记录并共享一下。

              二、前端传后端(@DateTimeFormat)

              前端给后端传递时间参数的时候传递的都是String类型的数据,后端如果用数据库类型Date来接收的话,则会报
              异常。此时后端如果在对应的时间字段上加上 @DateTimeFormat 注解,就可以解决这个问题,而且在存入数据库
              的时候依然用这个字段,而不用再进行类型转化。
              

              2.1 场景

              前端传过来的时间参数为String类型的数据的时候,就可以用如下的注解方式去接收数据,需要注意的是,注解中
              的样式如果为yyyy-MM-dd HH:mm:ss的话,前端穿的时候必须是这样的格式,如果前端只传yyyy-MM-dd的话,就
              会报异常。
              

              2.2 例子

                  //此时库里datetime类型的数据可以用Date类型直接进行存储
               	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
                  private Date createTime;
                  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
                  private Date updateTime;
              

              注意:这里的Date是在java.util.Date;这个包下面的,不要引用错误了。

              三、后端传前端

              3.1 场景

              后端传递给前端去展示时间的时候也是将时间转化为String类型的时间数据去返回。此时就需要加上 @JsonFormat
              注解来解决这个问题。
              

              3.2 例子

              	//这里就可以根据前端需要展示的时间格式进行返回,修改patter样式即可
              	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
                  private Date createTime;
                  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",locale = "zh", timezone = "GMT+8")
                  private Date updateTime;
              

              注意:这里的这个注解是在com.fasterxml.jackson.annotation.JsonFormat;这个包下的。并且时区记得加上,不然时间会少八个小时。

              四、java.sql包下的Date用法

              4.1 说明

              当前端展示为yyyy-MM-dd时并且后端也存为yyyy-MM-dd的时候可以用java.sql包下的Date来作为时间数据
              类型,此时后端无需做任何处理即可接收到前端传过来的该格式的数据。后端返回时也无需处理就会直接将该格式
              的数据返回。
              

              注意:和数据库映射的类中的时间格式也要用java.sql包下的Date类型。如果用java.util包下的Date则要用上面的注解进行处理。

              4.2 结果测试

              4.2.1 swagger请求传参

              前后端时间传递之注解形式(@DateTimeFormat与@JsonFormat),swagger请求数据传参,第1张

              4.2.2 接口
              @RestController
              @RequestMapping("/test")
              public class TestController {
                  @Resource
                  TestService testService;
                  @PostMapping("/save")
                  public TestVO save(TestDTO testDTO) {
                  	//测试类
                      Test test = new Test();
                      //属性拷贝
                      BeanUtils.copyProperties(testDTO, test);
                      boolean save = testService.save(test);
                      //如果新增成功就把该数据转化为Vo的形式返回
                      if (save) {
                          Integer id = test.getId();
                          Test testObj = testService.getById(id);
                          TestVO testVO = new TestVO();
                          BeanUtils.copyProperties(testObj, testVO);
                          return testVO;
                      }
                      return null;
                  }
              }
              
              4.2.3 接口中用到的实体类
              //实体类1
              @Data
              @EqualsAndHashCode(callSuper = true)
              @TableName(value = "test", autoResultMap = true)
              public class Test extends BaseEntity{
                  private static final long serialVersionUID = 1L;
                  /**
                   * 姓名
                   */
                  private String name;
                  /**
                   * 地址
                   */
                  private String address;
              }
              //公共实体类2,Model是mybatis-plus的类
              @Data
              public class BaseEntity extends Model {
                  /**
                   *
                   */
                  private static final long serialVersionUID = 1L;
                  /**
                   * 主键
                   */
                  @TableId(value = "id", type = IdType.AUTO)
                  @ApiModelProperty(value = "主键")
                  protected Integer id;
                  /**
                   * 逻辑删除标识
                   */
                  @TableLogic(value = "false", delval = "true")
                  @ApiModelProperty(value = "逻辑删除标识")
                  private Boolean deleted = Boolean.FALSE;
                  @ApiModelProperty(value = "创建时间")
                  private Date createTime;
                  @ApiModelProperty(value = "更新时间")
                  private Date updateTime;
                  @Override
                  protected Serializable pkVal() {
                      return this.id;
                  }
              
              4.2.4 返回结果

              前后端时间传递之注解形式(@DateTimeFormat与@JsonFormat),返回结果,第2张

              参考博客:

              https://blog.csdn.net/imVainiycos/article/details/102712056

              https://blog.csdn.net/Amir_wu/article/details/102563152

              说明:本文章内容为笔者亲测有效,若有不当之处,希望各位大佬不吝赐告,笔者定当虚心接收并改正。