问题描述

最近新申请了一台服务器,里面有一个MySQL8.0服务,当我用java代码将 current time insert 到表里时,MySQL中表里的时间却不正确。

问题分析

问题一

java在连接数据库时使用的是UTC时区(世界标准时间),也就是serverTimezone=UTC

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true
问题二

MySQL使用的time_zone属性是+00:00,而北京时间比UTC时间早8小时,即UTC+08:00

检查MySQL8.0服务的时区设置

-- 全局时区设置 + 会话时区设置 查看
mysql> select @@global.time_zone,@@session.time_zone;

-- 也可以这样查看市区,System表示使用系统时区,CST是一个比较乱的时区
mysql> show variables like '%time_zone%';

-- 验证时区,查看是否设置正确
mysql> select now();

解决方法

首先修改 jdbc 连接MySQL的参数,设置时区为东八区

// 通过serverTimezone参数来设置时区,咱们一般都是设置上海时间Asia/Shanghai
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true

再修改MySQL8.0数据库的时区为东八区

-- 方法A:使用命令设置
-- 优点:无需重启 MySQL Server
-- 缺点:MySQL服务重启后会失效)
mysql> set time_zone = '+8:00';
mysql> set global time_zone = '+8:00';

-- 方法B:修改配置文件 my.ini
-- 优点:重启后不会失效
-- 缺点:需重启MySQL服务
[mysqld]
default-time_zone='+8:00'

关于为什么Java保存时间到MySQL8.0时间会不正确的问题,解决方法就介绍完了,其实就是MySQL8.0时区的问题,希望对大家有所帮助。

本文由《MySql教程网》原创,转载请注明出处!https://mysql360.com