参考:https://blog.csdn.net/vae1314chuanchen/article/details/81838476

https://blog.csdn.net/sweatOtt/article/details/78111748

https://blog.csdn.net/weixin_42353194/article/details/90599215

一、修改MySql数据库的默认时区

MySql数据库创建后,默认的时区比东八区少了八个小时。如果Sql语句中使用到MySql的时间的话就会比正常时间少了八个小时。所以需要修改MySql的系统时区,使其显示的时间和我们现在的时间一致。
  
1)查看mysql系统时间

select now(); 
2)查看数据库时区

show variables like '%time_zone%';
3)设置时区更改为东八区

set global time_zone = '+8:00';
4)刷新权限

flush privileges; 
5)退出后重新登录,即可。

6)修改my.cnf实现永久修改MySQL时区。

cd /etc
vim my.cnf
7)在mysqld下边的配置中添加一行:

default-time_zone = '+8:00'
8)然后重启mysql

service mysql restart
sudo systemctl restart mysqld
二、修改数据库的驱动

若时间还是不对,有可能是驱动的问题,检查下驱动信息,如果连接参数中的字段serverTimezone设置为UTC,将UTC更改为 Asia/Shanghai就可以了。

jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
三、查看和修改Linux服务器上的时区

对于部署在海外的Linux服务器来说,拿到的机器时区和本地并不一样,导致运行在上面的应用也面临时区问题,所以有必要修改Linux服务器上的时区。
  1、查看服务器当前的时区
  查看当前生效的时区,可以通过date -R命令来查看当前时间。

[webadmin@host ~]$ sudo date -R
Sun, 19 Aug 2018 15:18:38 +0800
注:+0800,即东8区。
  2、设置时区
  1)通过tzselect命令查看时区向导
  tzselect命令看起来很像一个时区选择的工具,但并非如此。事实上tzselect仅仅是一个查看时区表示方式的『向导』程序而已。通过依次询问大洲→国家→城市,最后告诉你如何TZ变量的写法,比如北京时间是:Asia/Shanghai。
  2)通过修改TZ变量**,直接修改时区信息
  可以通过修改TZ变量,直接修改时区信息,比如:

[webadmin@host ~]$ sudo date -R
Sun, 19 Aug 2018 15:25:15 +0800
[webadmin@host ~]$ sudo export  TZ='Asia/Shanghai'
[webadmin@host ~]$ sudo date -R              
Sun, 19 Aug 2018 15:25:51 +0800
有Linux经验的小伙伴都知道,不写在文件里的设置更改很难生效一般是会话级的,重新登录会消失。所以,这样直接修改TZ的尿性绝对做不到持久化更改时区的。
  正确的方式是到/etc/profile里(或用户的.profile或.bashrc文件),直接export TZ变量为要更改的时区(时区的名字可以用tzselect向导来确定)。
  下面展示一波正确的做法:
  
1)代开文件.bash_profile

sudo vim ~/.bash_profile 
2)在文末添加export TZ=‘Asia/Shanghai’
3)使配置生效

source ~/.bash_profile
3)重启相关service或者直接重启服务器
  4)通过/etc/localtime文件修改时区
  默认情况下情况下,TZ属性是空,这时候是靠**/etc/localtime文件来确定的时区。而此文件通常又是一个到/usr/share/zoneinfo/下各种时区文件的软连接。通过修改/etc/localtime**指向的软连接,进而修改系统的时区。比如下面的方法,将localtime文件设置为了北京时间:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

四、

默认情况下mysql的time_zone为SYSTEM,也就是mysql的时区和服务器的时区是一样的。一般服务器都是东八区。在使用mysql时,客户端所在的时区一般也是东八区。所以从mysql查询timestamp类型数据时一切正常。

现在如果我们的条件是这样的:

使用的jdbc url长这样jdbc:mysql://localhost:3306/table_name
客户端的时区为零时区
mysql的时区是东八区

上面几个条件如果满足了,这时候你从mysql查找timestamp的数据,拿到的timestamp值和数据库中的值是一样的,没有考虑时区的问题,所以事实上是多了8小时。

通过debug,发现jdbc的ConnectionImpl类中configureTimezone()配置time zone时有几个条件

String canonicalTimezone = getServerTimezone();

if ((getUseTimezone() || !getUseLegacyDatetimeCode()) && configuredTimeZoneOnServer != null) {
            // user can override this with driver properties, so don't detect if that's the case
            if (canonicalTimezone == null || StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone)) {
                try {
                    canonicalTimezone = TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer, getExceptionInterceptor());
                } catch (IllegalArgumentException iae) {
                    throw SQLError.createSQLException(iae.getMessage(), SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
                }
            }
        }

if (canonicalTimezone != null && canonicalTimezone.length() > 0) {
            this.serverTimezoneTZ = TimeZone.getTimeZone(canonicalTimezone);
            ...
getServerTimezone()方法拿到的值默认为null,getUseTimezone()和getUseLegacyDatetimeCode()方法得到的值分别是false和true,这样就导致了connector不会使用数据库的time zone。所以我们从数据库内读取timestamp数据,不做任何时区转化。

如果想要开启时区转换,需要将useTimezone设置为true, 即jdbc:mysql://localhost:3306/table_name?useTimezone=true

我们可以看mysql文档对useTimezone描述

useTimezone 
Convert time/date types between client and server time zones (true/false, defaults to ‘false’)? This is part of the legacy date-time code, thus the property has an effect only when “useLegacyDatetimeCode=true.” 
Default: false
将useTimezone设置为true后,还有一点很重要,如果mysql的time_zone为SYSTEM,连接数据库是会报错的,需要给定一个明确的时区。我们可以把数据库的time_zone设置为+08:00,这样timestamp的数据就会根据时区进行转换。 如果不想修改数据库的time_zone,可以在客户端进行设置,指定time_zone,jdbc:mysql://localhost:3306/table_name?useTimezone=true&serverTimezone=GMT%2B8,GMT%2B8表示东八区。

五、最后一种方法:

设置spring配置文件:

1、spring.datasource.url=jdbc:mysql://10.35.105.25:3306/database?characterEncoding=utf-8&serverTimezone=GMT%2B8

数据库配置后面加上&serverTimezone=GMT%2B8

2、spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

spring.jackson.time-zone=GMT+8

第一步为设置数据库时间为东八区(北京)时间,保证debug时候从数据库查出时间一致。第二步为返回给前端的时间格式和时区设定,保证前端页面显示时间和数据库一致。

总结:认真分析各个步骤:数据库,驱动,后端向前端返回的时区

遇到mysql查询出来的时间在页面上相差几个小时相关推荐

  1. mysql中两个时间运算(获得相差天数、小时、分钟、秒)

    方法1: DATE_ADD() 函数向日期添加指定的时间间隔. 语法:DATE_ADD(date,INTERVAL expr type)     参数说明: date:起始日期或者起始时间 expr: ...

  2. 往数据库中插入时间,与预期值相差8个小时(时区设置)

    问题: 数据库中插入时间时,得到的结果比传入的时间不一致,少8个小时. 原因: 数据库连接时区设置的UTC (协调世界时间)或者GMT(格林尼治标准时间) 与中国时间不同,相差8个小时. 解决: 将数 ...

  3. [MySQL] 查询一段时间记录

    24小时内记录(即86400秒) $sql="SELECT video_id,count(id)as n FROM `rec_down` WHERE UNIX_TIMESTAMP(NOW() ...

  4. mysql查询今日没有时间字段_关于日期及时间字段的查询

    前言: 在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询.关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法. 1.日期和时间类型 ...

  5. MySQL查询出的时间与实际时间相差八小时

    今天通过Navacat查询数据,但是发现时间格式的字段比实际的时间少了八个小时,查找了一些资料后发现只需要在配置文件中数据库的url加一个参数serverTimezone=GMT%2B8即可,这个参数 ...

  6. datetime mysql 查询_mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

    数据库中可以用datetime.bigint.timestamp来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入50w数据 数据表: CREATE TABLE ` ...

  7. mysql 查询大于某个时间_有关于mysql 时间作为条件查询,索引失效的问题。

    今天遇到一个时间类型,索引失效的问题,记录一个整个过程. 1.先新建一张表,对create_time 字段添加索引 2.用存储过程向user表中批量插入数据 插入的数据总计为1000条. 3.用cre ...

  8. MYSQL查询大于创建时间一小时的数据

    以下代码中times为时间字段,类型为datetime 1.查询大于times一小时的数据 //大于号后面都是获取times一小时后的时间 select*from table where now() ...

  9. mysql查询:有关时间的筛选

    ###方法一:直接拿字段比较 (1)以下这两种方式最终效果一样 SELECT bb.borrow_no,bb.create_time FROM borrow bb WHERE bb.create_ti ...

最新文章

  1. WMI技术介绍和应用——查询驱动信息
  2. Java进阶:default方法说明
  3. Winforn中使用SaveFileDialog实现另存为对话框
  4. kafka整理笔记笔记
  5. 5.1.2 云计算的定义
  6. 在线CSV转HTMLTable工具
  7. 使用RouteDebugger对MVC路由进行调试
  8. python36安装opencv3.2_Python3.5.3下配置opencv3.2.0的操作方法
  9. MySQL 四种事务隔离级的说明
  10. (1)Jenkins Linux环境下的简单搭建
  11. 在cmd下载清华镜像
  12. UART子系统(二) UART协议层 物理层
  13. 华中电网项目日志:Rational version 7.0 技术会议纪要
  14. The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs(卡了线段树空间的思维题)
  15. Kubernetes集群安装 gatekeeper
  16. 计算机网络hdcp是什么意思,4.HDCP:支持高带宽数字内容保护协议HDCP
  17. 会员权益营销中,等级会员的五种权益设置
  18. 大锅菜机器人_学校食堂用上炒菜机器人 几分钟出一锅菜(图)
  19. LLVM 极简教程: 第一章 教程简介与词法分析器
  20. 加拿大曼尼托巴大学计算机专业几年,2020年加拿大曼尼托巴大学毕业时间是几月...

热门文章

  1. 当面试官问你“你期望的薪酬是多少”时,实际上是在问什么?
  2. 我爱计算机的作文500,我爱电脑四年级优秀作文
  3. Python:assert断言失败了,但是异常没有捕获,结果也显示通过
  4. win10桌面调用php,window_Win10在不同虚拟桌面打开同一个应用程序的方法,  Win10系统新增功能之一就 - phpStudy...
  5. hive查询结果保存到本地
  6. 假设有一段英文,将单词当中英文小写字母i 写成大写字母I,请编写程序纠正
  7. java基础-Idea的使用和方法
  8. 广州.NET俱乐部的活动
  9. 电商数据分析案例 与 职责要求
  10. 博途V17 官方开放下载链接了!!!