记录下今天开发遇到的一个小问题
同事用代码生成器生成了对应的实体类;其中表中用到的create_time是date类型。
MyBatisPlus代码生成器生成该对应字段的create_time实体类字段类型为:LocalDate。然后根据时间筛选时,发现有点小bug。测试代码如下
数据库中数据:
实体类:
private Integer id;
private String name;
private LocalDate createTime;
private String uniqueId;
private String notice;
请求对象:
@Data
public class Resp {
private Integer id;
private Integer age;
private String name;
private Date startDate;
private Date endDate;
}
测试接口:
@Resource
private UserMapper userMapper;
@PostMapping("testLocalTime")
public List<User> testLocalTime(@RequestBody Resp resp){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lambda()
.ge(User::getCreateTime,resp.getStartDate())
.le(User::getCreateTime,resp.getEndDate());
List<User> users = userMapper.selectList(wrapper);
return users;
}
postman:
?按照本来猜想:应该会将两条name = 张三和 name = 张羽数据筛选出来,但是却只筛选出了一条数据。后来经过打断点发现:date类型的时间虽然传参是2022-03-15但其实接收的是:Tue Mar 15 08:00:00 CST 2022。与LocalDate进行比较时时区的不同导致此次筛选的bug。
?修改之后代码:
@PostMapping("testLocalTime")
public List<User> testLocalTime(@RequestBody Resp resp){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lambda()
.ge(User::getCreateTime,resp.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
.le(User::getCreateTime,resp.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
List<User> users = userMapper.selectList(wrapper);
return users;
}
运行结果:
?
|