JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差

java后台系统时间和存入mysql的时间不一致

原因:系统时间一般为东八区时区,mysql时区默认为CST

系统时间
JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差
mysql查看时区
show variables like ‘%time_zone%’;
JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差
CST时区在mysql中有四种含义:
1.美国中部时间 Central Standard Time (USA) UTC-06:00

2.澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30

3.中国标准时 China Standard Time UTC+08:00

4.古巴标准时 Cuba Standard Time UTC-04:00

一般为美国中部时间,在开发时后台如果存入带时区的时间类型,mysql会进行时区转换,转换为美中部时区。具体差值会出现11、13、14小时偏差。

美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。如果时间不在“3月11日”至“11月7日”范围内,美中部时区为UTC-06:00,与与 UTC+08:00 相差 14 小时。

解决方案:

方案一:更改mysql时区
1:修改数据库时区为 UTC+08:00,不用CST这种有歧义的定义。
mysql> set global time_zone = ‘+08:00’; Query OK, 0 rows affected (0.00 sec)
mysql> set time_zone = ‘+08:00’; Query OK, 0 rows affected (0.00 sec)
2.与数据库连接时,定义时区,避免mybatis框架从mysql获取时区。在连接上加上 serverTimezone=GMT%2B8
链接配置:spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=true&allowMultiQueries=true&serverTimezone=GMT%2B8

方案二:java后台时间修正
由于时区转换,系统时间在存入mysql数据库时会少存入13或14小时,因此在后台存放时间前对时间进行加13或14小时,使mysql存入的时间与本地系统保持一致,至于加13还是加14,则需要判断是否在“3月11日”至“11月7日”范围内

方案三:存入string类型
如果存放的时间为LocalDateTime.now()类型,则会出现时区转换,造成显示上的时间差异JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差
存入String类型则不会出现时区转换JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差
JAVA系统时间存入mysql数据库,出现时区差,造成存入mysql时间差13、14或11小时偏差