JAVA系统夏令时导致的生日问题
起因
- 前几天机构老师突然反馈说是系统内客户生日比省份证少一天。
问题定位
- 系统之间是以JSON形式传递的
- 在排除是JSON 传值问题后,初步怀疑是时区问题导致的
- 通过对比发现,
TimeZone.getDefault()
的结果为Asia/Shanghai
而数据库的配置则是GMT%2B8
(也即是GMT+8
) - 由于我们国家曾在1986~1991年期间实行过夏令时,导致
Asia/Shanghai
与GMT+8之间存在1小时差异
解决方案
- 由于系统使用的是docker容器部署,因此采用直接修改dockerfile的方式就行修复:
ENTRYPOINT java -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08 xxx/xxx.jar