MySQL时区查看及设置全过程
作者:AGLJC
在服务器环境下,MySQL默认时区可能是UTC,需注意应用时区设置,若查询条件使用Now()/sysdate(),会根据MySQL时区查询,导致时间错乱,可使用`selectnow()`检查时间准确性,查看和修改MySQL时区的方法包括使用命令和修改配置文件
说明
在服务器环境下(linux 或 docker),有时系统时区默认是 UTC 时区,这时需要格外注意下应用使用的时区信息。
若查询条件中含有 Now()/sysdate(),则会按 mysql 的时区信息查询,造成时间错乱。
可以使用 select now(); 来检查 mysql 的当前时间是否准确。
查看数据库获取的当前时间语句:
select SYSDATE(); select now();
查看时区
show variables like '%time_zone%';
看到MySQL 服务器使用操作系统的时区设置,系统使用了CST时区
Time zone: Asia/Shanghai (CST, +0800):
中国标准时间:China Standard Time UT+8:00
[root@hcss-ecs-3983 ~]# timedatectl Local time: Sun 2024-07-28 14:43:17 CST Universal time: Sun 2024-07-28 06:43:17 UTC RTC time: Sun 2024-07-28 06:43:15 Time zone: Asia/Shanghai (CST, +0800) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a [root@hcss-ecs-3983 ~]# date Sun Jul 28 14:46:38 CST 2024
Java程序MySQL链接url配置
url: jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
修改MySQL的时区
可以使用以下命令修改数据库的时区
SET GLOBAL time_zone = 'Asia/Shanghai'; SET time_zone = 'Asia/Shanghai';
也可以修改my.cnf配置文件修改,添加一行,重启MySQL服务生效
default-time-zone=Asia/Shanghai
docker容器使用宿主机时区
命令格式:
docker exec your_container_name ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
通过容器名去修改,示例如下:
[root@hcss-ecs-3983 ~]# history | grep timezone 1299 2024-07-14 13:43:34 root docker exec mysql ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone 2159 2024-07-28 15:00:25 root history | grep timezone [root@hcss-ecs-3983 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 577359655a60 redis:6.0.6 "docker-entrypoint.s…" 5 weeks ago Up 2 weeks 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis 920994cf01b0 mysql:8.0.30 "docker-entrypoint.s…" 7 weeks ago Up 3 days 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
修改后,容器的时间:
bash-4.4# date Sun Jul 28 15:01:50 CST 2024 bash-4.4#
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。