解决方法:在MySQL配置文件my.cnf中添加default-time-zone = '+8:00',然后重启MySQL服务。同时在Java代码中设置JVM时区:TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); 数据库查询时使用 CONVERT_TZ函数转换时区,如 SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00');
第一篇来源内容
问题描述:MySQL数据库时间比实际时间少8个小时,插入的时间字段显示不对。原因是MySQL默认使用系统UTC时间,而中国是东八区。解决步骤:1. 查看当前时区:SHOW GLOBAL VARIABLES LIKE '%time_zone%'; 2. 修改my.cnf配置文件,[mysqld]下添加 default-time-zone='+8:00' 3. 重启MySQL:service mysql restart 4. 验证:SHOW GLOBAL VARIABLES LIKE '%time_zone%'; 显示+08:00即可。
第二篇来源内容
排查MySQL时间偏差:先确认系统时区 date命令查看,如果系统是UTC,需要同步。MySQL中设置 time_zone = 'Asia/Shanghai' 或 '+8:00'。代码端,JDBC连接时添加 serverTimezone=Asia/Shanghai 到URL。Spring Boot application.yml中 spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai。
第三篇来源内容
一劳永逸解决:统一使用TIMESTAMP类型,不要用DATETIME。TIMESTAMP是UTC存储,显示时自动转换。配置my.cnf:default-time_zone='+08:00',init_connect='SET NAMES utf8mb4;SET time_zone="+8:00"'。客户端连接后执行SET time_zone = '+8:00'; 测试插入NOW(),查看是否正确。
第四篇来源内容
时间不同步常见原因:Docker容器时区问题,运行docker时加 -e TZ=Asia/Shanghai。MySQL容器设置环境变量 TZ=Asia/Shanghai。宿主机同步时间 ntpdate time.nist.gov。代码中Date时间对象转LocalDateTime时指定ZoneId.of("Asia/Shanghai")。
第五篇来源内容
完整排查:1. 系统时间:timedatectl 2. MySQL时区变量 3. 连接时区:SELECT @@session.time_zone; 4. 插入测试:INSERT INTO test(time) VALUES(NOW()); SELECT time FROM test; 解决方案:在/etc/mysql/mysql.conf.d/mysqld.cnf 添加 default-time-zone='+08:00' 重启。
第六篇来源内容
PHP代码处理:date_default_timezone_set('Asia/Shanghai'); PDO连接加 'timezone' => '+08:00'。查询时用 DATE_ADD(时间字段, INTERVAL 8 HOUR)。最好服务器端统一设置,避免代码到处补8小时。
Q: MySQL时间为什么偏差8小时?
A: 因为MySQL默认UTC时区,中国东八区,相差8小时。
Q: 修改my.cnf后不用重启吗?
A: 必须重启MySQL服务才能生效。
Q: Java程序怎么设置?
A: JDBC URL加?serverTimezone=Asia/Shanghai,或者JVM参数 -Duser.timezone=GMT+8。
Q: TIMESTAMP和DATETIME区别?
A: TIMESTAMP受时区影响自动转换,DATETIME不转换,按字符串存。
Q: Docker MySQL怎么搞?
A: docker run -e TZ=Asia/Shanghai -e MYSQL_INITDB_SKIP_TZINFO=0。