常见的问题就是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。