在linux服务器上安装MySQL数据库服务,在MySQL服务启动时,会尝试使用主机时区设置MySQL服务的系统变量system_time_zone。在服务启动时可以使用--timezone显式配置当前系统支持的时区。如果启动时没有显式配置,MySQL的time_zone初始值就是‘SYSTEM’,服务中的Global时区和Session时区和服务器时区一致。如果我们程序服务器的时区与连接数据库的时区不一致就会发生异常。
查看MySQL所在服务器时区:
[root@snopyf ~]# timedatectl
Local time: Thu 2022-08-25 01:45:46 EDT
Universal time: Thu 2022-08-25 05:45:46 UTC
RTC time: Thu 2022-08-25 05:45:45
Time zone: America/New_York (EDT, -0400)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2022-03-13 01:59:59 EST
Sun 2022-03-13 03:00:00 EDT
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2022-11-06 01:59:59 EDT
Sun 2022-11-06 01:00:00 EST
当前MySQL服务器时区属于America/New_York,
打印了一下当前程序时区
INFO 30312 ---[main]com.venus.StorageApplication:sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]
很明显不一致。
解决办法:
- 方法一:修改MySQL服务器时区和重启数据库
#使用命令查看当前支持的时区,选择与程序一致的进行修改,
[root@snopyf ~]# timedatectl list-timezones
...
Asia/Seoul
Asia/Shanghai
Asia/Singapore
...
#修改系统时区
[root@snopyf ~]# timedatectl set-timezone Asia/Shanghai
#重启数据库
[root@snopyf ~]# systemctl restart mysqld
- 方法二:
在jdbc连接的url后面加上serverTimezone=可用时区,即可解决问题,
- 方法三:MySQL5.1.28以下版本不会存在时区的问题。