MySQL 总是差八个小时,如何破?

article/2025/10/10 18:21:08

今天来聊一个简单的话题,这是一个小伙伴在微信上问我的,对于初学者我非常能理解这类问题带来的困扰,各种尝试,各种搜索,别人说的头头是道,但是就是解决不了自己的问题,今天我简单从两个方面来和大家聊聊这个问题,如果小伙伴们有其他的解决思路,也可以留言一起分享。

这个问题我们可以从两方面来分析:

  1. MySQL 本身的问题。
  2. Java 代码的问题。

1. MySQL 本身问题

MySQL 本身问题,这个其实很好验证,不就是时间么,我们执行如下 SQL 看看 MySQL 上的时间跟我的电脑时间是否是一致的:

select now();

可以看到,MySQL 的这个时间跟我系统的时间其实就差了 8 小时,MySQL 本身的时间都不对,那你将来插入/查询的时间肯定也不对。

这个查询大家注意,要么使用命令行操作,要么使用 Sqlyog、Navicat 或者 Sequel Pro 之类的数据库工具来操作,切勿使用 JDBC 来查询,具体原因一会看完第二小节就明白了。

出现这个问题,多半是 MySQL 的时区不太对,我们重新给其设置一下时区即可。

首先我们通过如下指令来查看一下 MySQL 当前的时区:

show variables like '%time_zone%';

可以看到,MySQL 说它的时区是 SYSTEM,那 SYSTEM 又是啥呢?第一条说了 SYSTEM 是 UTC(协调世界时,又称世界标准时间或世界协调时间)。而我们的北京时间比 UTC 快了 8 小时,即 UTC+8。

所以我们现在要把 MySQL 的时区先给改对,可以通过修改配置文件来实现(/etc/mysql/mysql.conf.d/mysqld.cnf),如下:

修改完成后,重启 MySQL,再来查看 MySQL 的时区:

可以看到,此时的 MySQL 时区就正常了。

那么此时再执行 select now(); 也就不会有问题了:

有的小伙伴可能嫌修改配置文件太麻烦了,那么也可以通过 SQL 来修改时区:

set global time_zone = Asia/Shanghai

注意我们所在的时区是 Asia/Shanghai,小伙伴们不要自由发挥写其他城市。

首先我们要确认 MySQL 没问题。

2. JDBC 连接问题

当确认了 MySQL 没有问题后,如果你的 MySQL 时间还是不对,那么就有可能是 JDBC 连接的问题了。

这里我用大家常见的 JdbcTemplate 来举个例子,其他的数据库框架操作也都是一样的,我这里主要是演示时区问题,数据操作细节问题就不再展示了。

首先我们来准备一个表,如下:

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`createTime` datetime DEFAULT NULL,`updateTime` timestamp NULL DEFAULT NULL,`username` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

很简单的几个字段,createTime 是 datetime 类型,updateTime 是 Timestamp 类型。

然后向表中添加一条记录:

并且这个数据库的时区是 Asia/Shanghai

接下来我们创建一个 Spring Boot 项目,引入 Web、JDBC API 依赖和 MySQL 驱动,如下:

然后我们来配置一下 MySQL 的连接信息,如下:

spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test01?serverTimezone=UTC

小伙伴们看一下,在数据库连接地址中,我特意设置了时区为 UTC,这个时区比我们目前的时区慢了 8 小时,我们来看看用这样一个错误的时区,操作的结果是什么样子的。

@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {List<User> list = jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));System.out.println("list = " + list);
}

大家看到,这个查询结果查到的时间是 21 点,跟 13 点相比快了 8 小时。

为啥呢?

因为我们连接地址中加了 serverTimezone=UTC 参数,这个时候,系统会把从数据库查询到的数据当成是 UTC 时区的,即把 13 点当成 UTC 时区的,但是我自己当前设备又是 Asia/Shanghai 时区,UTC 时区的 13 点转成 Asia/Shanghai 时区之后就是 21 点了。

相同道理,大家也可以自行尝试设置 serverTimezone=Asia/Tokyo,时区设置为东京,东京比我们早一个小时,东京的 13 点就是我们的 12 点,那么最终查询结果就是 12 点。

从这个案例中我们可以看到,jdbc 连接参数中的时区优先级高于 MySQL 服务器的时区参数,所以这个连接参数大家也要尤其注意。

3. 题外话

有的小伙伴遇到的时区问题则是另外一种,返回 JSON 的时候时间不对。

如果在项目中用了 jackson,并且使用 @JsonFormat 注解来格式化日期,就有可能出现时区问题,如下:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")

大家看到,这段代码如果没有设置 timezone 属性,那么默认的时区就是 UTC,也会导致最终的时间差了 8 小时。

4. 小结

好啦,这就是松哥总结的数据库的几种情况,小伙伴们如有补充欢迎留言讨论。


http://chatgpt.dhexx.cn/article/gn9J5JQ4.shtml

相关文章

存入mysql时间少了8小时

在接口测试的时候&#xff0c;发现时间少了8小时。通过网上各个博客发现了两个问题。 首先是显示在页面的时间格式(date)和我从api接口里测试的也不同。 时间格式的处理&#xff0c;前端的时间显示2020-07-13T16:02:00.0000000 在后端添加JsonFormat JsonFormat(shapeJsonFo…

mysql当日及后5天数据

java /mysql统计当天及前六天的数据&#xff0c;如果中间哪天数据为空&#xff0c;怎么在相应的位置插入动态的时间 你可以在查询出结果之后&#xff0c;生成JSON的时候&#xff0c;在那里判断一下后面时间不是与前面的时间相差一天&#xff0c;如果不是&#xff0c;把这天数据…

MYSQL 第六天

课堂作业 1. 创建数据库company,在库中创建两个表offices和employees表 小鹅通作业 1.用SQL语句创建学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在系的默认值是 “计算机”。 create table student( Sno int p…

MySQL高级篇第二天

文章目录 一、Mysql的体系结构概览 二、 存储引擎 三、优化SQL步骤 一、Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 O…

MySql(第二天)

文章目录 数据库查询操作1.单表查询2.多表查询3.MySql远程连接 数据库查询操作 1.单表查询 --数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charsetutf8;-- 使用数据库 -- use python_test_1;-- students表 -- create table students( -- id int …

mysql查询0~3天、4~7天、8~15天、16~30天的sql语句

1、NOW(), CURDATE(), CURTIME()的值 2、date_add(now(), interval 1 day) //当前时间加一天 date_sub(now(), interval 1 day) //当前时间减一天 3、简单函数 CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END 搜索函数 CASE WHEN [expr] THEN [result1]……

idea中maven项目打包为jar

在idea中打包maven项目时有很多解决的方案&#xff0c;可出乎意料的是&#xff0c;使用某些方案时有一些未知的错误情况。经过测验后&#xff0c;记录了下面一种简单有效的方法 在pom.xml中添加 <build><plugins><plugin><groupId>org.apache.maven.…

maven项目打包部署到服务器上

创建一个maven项目&#xff0c;在本地工程依赖jar包启动完成后&#xff0c;是不够的&#xff0c;还需将项目文件使用maven编译打包然后部署到服务器上 主流的springboot项目打包的时候需要在pom文件中指定主方法等配置 解决打包部署的时候报错no main manifest attribute, in…

如何将maven项目打包成可执行的jar

方法一&#xff1a;将项目及所依赖的所有jar包打包成一个jar。 1、pom.xml添加assembly插件 2、执行mvn assembly:assembly 3、生成如下文件 4、执行java -jar quickstart-1.0.0-jar-with-dependencies.jar 备注&#xff1a;第2步的命令也可以改成mvn package&#xff0c;但需…

Maven项目打包

在做项目时&#xff0c;都会在做项目的打包操作的&#xff0c;不同的环境下有不同的打包方式&#xff0c;在maven项目中可以使用pom.xml配置文件中实现配置&#xff0c;首先要创建一个web项目 先说一下打包成war包吧 - 创建好项目后&#xff0c;需要配置pom.xml配置文件来指定打…

IDEA打包Maven项目

一、第一次需要在IntelliJ IDEA中打包Maven项目&#xff0c;弄了半天&#xff0c;才搞好&#xff0c;记录一下。 二、打包步骤 1. 在IntelliJ IDEA主界面的右侧点击Maven Project&#xff1a; 2. 在打开的页面中点击lifecycle&#xff1a; 3. 然后双击package&#xff1a; 4.…

【IDEA】Maven项目打包 无效的目标发行版: 17 (全)

问题解决方法 项目运行出错Maven打包出错 问题&#xff1a; 曾经切换过jdk版本&#xff0c;切回17时&#xff0c;出现的了如题的错误。 且运行不报错&#xff0c;但maven进行打包时报错。其他版本同理。 解决方法&#xff1a; 1. 项目运行出错 pom.xml可能出现问题&#…

maven如何打包你会吗?

1.新建一个maven项目&#xff0c;在main/java中建立Main类 public class Main {public static void main(String[] args) {System.out.println("hello java ...");} } 2.添加依赖&#xff0c;使其成为可执行包 <build><plugins><!--打包成为可执行包-…

IDEA中Maven项目打包方式

方式一&#xff1a; 直接打包&#xff0c;不打包依赖包&#xff0c;仅打包出项目中的代码到JAR包中&#xff0c;可称为架包。在其他应用中运行时&#xff0c;必须保证其上面有相应的依赖包&#xff0c;才能运行。maven——》Lifecyle——》Clean——》Package 打包成功后就会出…

将IDEA MAVEN项目打包成jar包的通用方法

1.找到左上角File -> Project Structure&#xff0c;点击&#xff08;中文&#xff1a;文件 -> 项目结构&#xff09; 2. 在弹出的界面中&#xff0c;点击Artifacts&#xff08;中文&#xff1a;工件&#xff09;&#xff0c;点击内置页面的左上角的号&#xff0c;选中第…

maven多个子项目如何打包?

两种方式: 第一种方式: 父模块pom 不配置任何打包命令; 子模块(资源pom) 指定这个pom是资源类型; 子模块(服务pom) 指定这个pom是java服务类型; 1. 前提: maven对应多个子项目, 每个子项目都是一个单独运行的jar包 2. 项目结构: 五个 jar包; 一个common资源包 3. 思…

maven项目常用的打包方式

一、无依赖其他任何jar <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive>…

IDEA中MAVEN项目如何打包JAR包

这篇文章主要为大家展示了“IDEA中MAVEN项目如何打包JAR包”&#xff0c;内容简而易懂&#xff0c;条理清晰&#xff0c;希望能够帮助大家解决疑惑&#xff0c;下面让小编带领大家一起研究并学习一下“IDEA中MAVEN项目如何打包JAR包”这篇文章吧。 Idea中为一般的非Web项目打J…

Maven项目打包为jar的几种方式

Maven项目打包为jar的几种方式 这里收集整理下以往打包MAVEN项目为JAR包的各种方式 ##直接打包&#xff0c;不打包依赖包 直接打包&#xff0c;不打包依赖包&#xff0c;仅打包出项目中的代码到JAR包中。在POM中添加如下plugin即可&#xff0c;随后执行maven install <plu…

mac电脑如何图片压缩优化,附教程

mac电脑如何将图片无损压缩且优化&#xff1f;今天小编给大家带来一款软件ImageOptim这款小巧免费且开源的Mac 图片无损压缩优化工具。如何工作下面给大家介绍ImageOptim for mac图片压缩优化教程。 标题ImageOptim图片压缩优化软件使用教程 当你拖放图片到ImageOptim的窗口&…