开发的过程遇见的了这个问题,起初因为一个接口,接收json数据,通过JSONArray 转为list集合,实体类中的一个LocallDatetime 类型的变量,在接收“2024-02-21 13:21:37”格式的时间,存入数据库之后,对应的数据库字段类型是timestamp(6),会出现隐藏时间,毫秒值甚至微妙值。导致后续一个重复校验用到这个字段时,校验无法生效,后续通过将json里这字段的值改为记录时间戳,实体类对应字段改为java.util.Date类型,存入数据库,由数据库转为日期格式,保证了时间上的一致。但之后发现,数据库该时间值查询出来,赋值给java.util.Date类型的字段后,出现了时区问题,例如数据库中是“2024-03-01 10:02:30”,查询出来赋值给该字段后时间是“2024-03-01 03:02:30”,相差七个小时。
解决方案:
第一种是 查询sql中给该字段设置时区,该方法在postgreSql有效,其他数据库未验证
select 列名 at time zone 'UTC' as 别名 from 表
第二种,在配置文件中设置
第一个设置日期格式,第二个根据时区加减对应时间
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+7