MySQL与服务器时区问题实践总结

本文介绍了解决Linux和MySQL环境中常见的8小时时间偏差问题的方法。包括调整Linux时区设置、修改MySQL时区配置以及通过JDBC连接指定时区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的问题就是8小时问题,通常是由于时区设置错误导致的。

【1】Linux时区

① Centos6下

查看时区

[root@VM_0_12_centos ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"

[root@VM_0_12_centos ~]# date -R
Tue, 12 Jan 2021 09:42:34 +0800

+0800表示东八区

设置时区

# 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#软连接设置
 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改完Linux时区后,如果MySQL的时区应用的是time_zone=SYSTEM 。那么只有重启MySQL服务才能更新MySQL时区为Linux更新后的时区!

【2】MySQL时区

① 查看MySQL时区

show VARIABLES like '%time_zone%';

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+

system_time_zone : 表示系统使用的时区是 CST

time_zone: 表示 MySQL 采用的是系统的时区。也就是说,如果在连接时没有设置时区信息,就会采用这个时区配置。

修改MySQL时区

#修改my.cnf文件 [mysqld]添加如下配置  记得重启mysql服务
default-time-zone='+08:00'

② jdbc连接URL指定时区

修改jdbc连接设置,直接把连接的时区固定死,绕开mysql本身的时区。就是在jdbc连接配置上添加以下两个配置即可:

useTimezone=true&serverTimezone=GMT%2B8

#分别为启用时区设置和设置连接服务的时区。

或者:
serverTimezone=Asia/Shanghai

【3】CET,UTC,GMT,CST

① GMT

Greenwich Mean Time。 格林威治标准时间, 英国伦敦格林威治定为0°经线开始的地方,地球每15°经度 被分为一个时区,共分为24个时区,相邻时区相差一小时;例: 中国北京位于东八区,GMT时间比北京时间慢8小时。所以常见数据库URL上设置GMT+8

格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

② UTC

Coordinated Universal Time。 世界协调时间,经严谨计算得到的时间,精确到秒,误差在0.9s以内, 是比GMT更为精确的世界时间。

协调世界时,又称世界标准时间或世界协调时间,简称UTC,从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来。台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》(与ISO 8601类似)称之为世界统一时间。中国大陆采用ISO 8601-1988的国标《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408)中称之为国际协调时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。

③ DST

Daylight Saving Time。夏季节约时间,即夏令时。是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时。

④ CST

Central Standard Time。北京时间,China Standard Time,又名中国标准时间,是中国的标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8,与中华民国国家标准时间(旧称“中原标准时间”)、香港时间和澳门时间和相同。当格林威治实践为凌晨0:00时,中国标准实践刚好为早上8:00。

Central Standard Time (USA) UT-6:00(美国cst时间:零区时减6个小时)
Central Standard Time (Australia) UT+9:30(澳大利亚cst:加9个半小时)
China Standard Time UT+8:00(中国cst:8个小时)
Cuba Standard Time UT-4:00  (古巴cst:4个小时) 

CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间

Asia/Shanghai是已地区命名的地区标准时,在中国叫CST,Linux不能显示设置为CST,可以是Asia/Shanghai。

⑤ CET

欧洲中部时间(英語:Central European Time,CET)是比世界标准时间(UTC)早一个小时的时区名称之一。它被大部分欧洲国家和部分北非国家采用。冬季时间为UTC+1,夏季欧洲夏令时为UTC+2。

【4】测试

① 设置Linux时区为PST(America/New_York)

如下设置后,Linux时区将会快8小时。

ln -sf /usr/share/zoneinfo/US/Pacific /etc/localtime

ls -l /etc/localtime
lrwxrwxrwx 1 root root 30 Jan 12 04:44 /etc/localtime -> /usr/share/zoneinfo/US/Pacific

date -R
Tue, 12 Jan 2021 05:11:17 -0800

② 查看此时MySQL时区

重启MySQL服务,查看时区:

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PST    |
| time_zone        | SYSTEM |
+------------------+--------+

那么此时项目部署在Linux上,进行插入操作,则插入时间会快8小时:
在这里插入图片描述

③ 设置MySQL时区

修改my.cnf,[mysqld]下添加配置:

default-time-zone = '+8:00'

然后重启MySQL服务。再次查看MySQL时区:

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PST    |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)

再次进行数据插入,此时时间正常:
在这里插入图片描述

④ 恢复MySQL时区采用系统时区,通过jdbc.url指定

spingboot项目中application.properties配置如下:

spring.datasource.url=jdbc:mysql://XXXX:3306/fruitmarket?useUnicode=true
&characterEncoding=utf8&serverTimezone=GMT%2B8&useTimezone=true

修改Linux时区为Asia/Shanghai :

[root@VM_0_12_centos classes]# date -R
Tue, 12 Jan 2021 06:26:10 -0800
[root@VM_0_12_centos classes]#  ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@VM_0_12_centos classes]# date -R
Tue, 12 Jan 2021 22:27:52 +0800

useTimeZone

主要用在web服务器和数据库部署在不同时区时,转换二者交互中时间数据。

例如:web服务器部署在北京(GMT+8),数据库部署在美国加州(GMT-8)。现在web数据库有一条记录的创建时间是当地时区时间22:00,那存储到数据库的时间应该是数据库当地时区时间06:00。然后web服务器通过jdbc读取到这条记录后,读取到的创建时间应该仍旧是以当地时区为标准的22:00。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值