排查思路
- 查看插入值是否正确无误
- 插入值是否因为进行字符串与其他类型转变导致值发生变化
- 查看sql 是否正确无误
- 查看数据库插入时打印日志是否无误
- 判断数据库链接时区问题
遇到的问题复现
本人是用esayexcel 导入数据,导入后发现 数据中有CDT 格式和CST格式,所以问题就出现这个CDT上 如果不知道这两个的区别大家可以自行百度,
摘要
名为 CST 的时区是一个很混乱的时区,在与 MySQL 协商会话时区时,Java 会误以为是 CST -0500,而非 CST +0800。
CST 时区
名为 CST 的时区是一个很混乱的时区,有四种含义:
- 美国中部时间 Central Standard Time (USA) UTC-06:00
- 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
- 中国标准时 China Standard Time UTC+08:00
- 古巴标准时 Cuba Standard Time UTC-04:00
今天是“4月28日”。为什么提到日期?因为美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。
解决方案
解决方案:
查看问题真正产生的原因。
- 打印获取到日期,发现两个日期存在了时区的不同,一个为CDT,一个为CST;
- CDT:为夏令时时间(中华人民共和国在1986年~1991年实行了夏令时制度,每年夏令时实行时间如下:
1986年5月4日至9月14日(1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束)
1987年4月12日至9月13日,
1988年4月10日至9月11日,
1989年4月16日至9月17日,
1990年4月15日至9月16日,
1991年4月14日至9月15日。
);CST:为美国、澳大利亚、古巴或中国的标准时间。 - CST的时间和CDT的时间是相差了13个小时。
解决方案:
常用的CMT+8的时区设置,并不兼容夏令时。
而使用TimeZone = Asia/Shanghai,则会兼容夏令时。
当mysql的url,修改为配置serverTimezone=Asia/Shanghai;解决了插入数据库时间错误问题。
但是,当返回给前端的时候,设置JsonFormat的timeZone的时候,也需要使用此配置:@JsonFormat(timezone = “Asia/Shanghai”, pattern = “yyyy/MM/dd”);这样才可以保证前端的数据展示正确。
大佬博客:
https://blog.youkuaiyun.com/weixin_38608626/article/details/108378687