踩雷篇 - JsonFormat遇到夏时制

601 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前段时间遇到一个离谱的问题,用户的生日通过后端返回直接少了一天,debug半天发现每次在调试时数据库返回都是正确的值,但是接口响应体中莫名奇妙,减少一天。

调试过程:

开始就采用debug看是不是数据库搞的鬼,发现数据从数据库拿出一切正常。

这就很怪异,为啥数据是对的接口响应就出问题了呢?

然后多测几组数据发现更诡异,有的日期就很正常,有的日期就不行,尤其是和这个用户生日相近的日期,出现少一天的几率很高。然后我就增加测试用例,多测几组数据将出错时间定在1886年-1991年。而且我将@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT + 8") 调整为@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT + 8")判断它是不是因为时区造成的,发现这个日期只比正常的少一个小时,显然不是因为时区问题。

然后我就去百度搜索这个时间节点少一个小时,找到一个概念就是夏时制

1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行,时间调快1小时。

发现就是因为JsonFormat没有对夏时制进行处理,导致的。然后我从查询了相关的解决方案。

JsonFormat 是源于SpringBoot包下的,不确定的是高版本是否有相关优化。

解决方案:

一、使用虚拟机参数

-Duser.timezone=GMT+08

# 启动时加入
java -java test.jar -Duser.timezone=GMT+08

二、使用SimpleDateFormat 格式化

SimpleDateFormat 格式化 Date 经测试没有这个问题,可以手动用这种方式格式化 或者用字符串拼接的方式,具体还要考虑业务场景。