在我们开发的过程中常常会遇到前后端传递时间的问题,同样遇到了这样的问题,以前的做法是在代码中转换:前端传String类型的时间,然后后端用String接收以后存入数据库时再转化为Date;返回给前端时也是一样,先从数据库中查出Date类型的数据,返回给前端时转化为String,非常麻烦。后来也是看到了用注解的方式非常方便,在这里记录并共享一下。
前端给后端传递时间参数的时候传递的都是String类型的数据,后端如果用数据库类型Date来接收的话,则会报 异常。此时后端如果在对应的时间字段上加上 @DateTimeFormat 注解,就可以解决这个问题,而且在存入数据库 的时候依然用这个字段,而不用再进行类型转化。
前端传过来的时间参数为String类型的数据的时候,就可以用如下的注解方式去接收数据,需要注意的是,注解中 的样式如果为yyyy-MM-dd HH:mm:ss的话,前端穿的时候必须是这样的格式,如果前端只传yyyy-MM-dd的话,就 会报异常。
? ? //此时库里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;这个包下面的,不要引用错误了。
后端传递给前端去展示时间的时候也是将时间转化为String类型的时间数据去返回。此时就需要加上 @JsonFormat 注解来解决这个问题。
?? ?//这里就可以根据前端需要展示的时间格式进行返回,修改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;这个包下的。并且时区记得加上,不然时间会少八个小时。
当前端展示为yyyy-MM-dd时并且后端也存为yyyy-MM-dd的时候可以用java.sql包下的Date来作为时间数据 类型,此时后端无需做任何处理即可接收到前端传过来的该格式的数据。后端返回时也无需处理就会直接将该格式 的数据返回。
注意:和数据库映射的类中的时间格式也要用java.sql包下的Date类型。如果用java.util包下的Date则要用上面的注解进行处理。
@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; ? ? }
}
//实体类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<T extends Model> 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; ? ? }