背景

今天早上刚上班,就被同事提示,程序的日期处理有问题。数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00

分析

那肯定是和时区相关了,别问为什么,这是程序猿该有的直觉。

首先,看一下mysql的时区是什么?

命令:show variables like '%time_zone%';

结果:

Variable_name Value
system_time_zone CST
time_zone SYSTEM

那么CST时区究竟是什么时区呢,我们下面简单介绍一下:

CST 的时区是一个很混乱的时区,有四种含义:

  • 美国中部时间 Central Standard Time (USA) UTC-06:00
  • 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
  • 中国标准时 China Standard Time UTC+08:00
  • 古巴标准时 Cuba Standard Time UTC-04:00

今天是“4月28日”。为什么提到日期?因为美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。

JDBC与MySQL开始建立连接时,在配置时区的时候,会拿到MySQL的时区是CST,然后Java 会误以为是 CST -0500,而非 CST +0800。

正是因为这个原因,所以导致时间出现问题:16:00:00减去5个小时,正好是11:00:00

解决方案

1、不动mysql数据库的时区的前提下

将项目的时区设置为世界标准时区UTC

在mysql的连接url上加上UTC时区

  1. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mccs?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC

可能有些同学会疑惑,为什么不设置为中国的时区(上海),其实呢,是可以的,但是单单只设置项目的时区是不行的,我们下面看看:

  1. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mccs?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai

返回给前端的日期为:2019-05-21 03:00:00。因为我们的时区是CST +0800。所以11:00:00减去8个小时候就是03:00:00了。

那么可以看出,单单设置项目的时区为中国时区是不行的。那么有什么补救方法呢?

如果对日期的格式化你是用的是jackson,那么再加多一条配置,就可以了:

  1. spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
  2. spring.jackson.time-zone=GMT+8
2、直接修改mysql数据的时区

直接修改mysql数据库的时区是最彻底的,之后所有的项目都不用管时区的问题了。

方式一:命令修改

set global time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区

set time_zone = '+8:00'; ##修改当前会话时区

flush privileges; #立即生效

方式二:修改配置文件【linux:my.cnf,windows:my.ini】

在[mysqld]区域中加上:default-time_zone = '+8:00'

最后记得重启MySQL的服务。

MySQL-时区导致的时间前后端不一致的更多相关文章

  1. mysql定时删除当前时间前分钟的数据

    mysql定时删除当前时间前分钟的数据 2013-01-31      0个评论       作者:上官车月 收藏    我要投稿 mysql定时删除当前时间前分钟的数据   Sql代码  www.2 ...

  2. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  3. Spring Boot+Jpa(MYSQL)做一个登陆注册系统(前后端数据库一站式编程)

    Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且连接我们的MySQL数据库. 我将假设读者为几乎零基础,在实战讲解中会渗透Sprin ...

  4. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  5. Nginx完美解决前后端分离端口号不同导致的跨域问题

    笔者在做前后端分离系统时,出现了很多坑,比如前后端的url域名相同,但是端口号不同.例如前端页面为:http://127.0.0.1/ , 后端api根路径为 http://127.0.0.1:888 ...

  6. 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】

    要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...

  7. 关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)

    不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到…… 然后我在后端从service到controller都debug了一遍,发现数据都没 ...

  8. Mysql数据库存储数据时间与系统获取时间不一致

    最近进行项目开发,发现存在数据库内的数据和系统查询到的数据相差8小时 发现有2种比较合适的方法 (一)修改mysql服务的区时 centos进入mysql查看/修改时区 1.输入以下命令进入mysql ...

  9. MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

    MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 &l ...

随机推荐

  1. Go语言标准库之strconv

    Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换. strconv包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().pa ...

  2. Scratch Blocks本地环境搭建

    关于Scratch Blocks环境的搭建,大家在实现的过程中还是有很多的问题,目前谷歌和MIT的工程师也在进一步完善.可以通过以下方式,简单快捷的导出Scratch Blocks对应的index.h ...

  3. java8中字符串常量以及GC相应处理机制

    目录 1,常量池 1.1, class文件常量池 1.2, 运行时常量池 1.3,字符串常量池 String.intern() -XX:StringTableSize 2,使用new关键字和使用字符串 ...

  4. git的几个小技巧

    git的几个小技巧 分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修 ...

  5. sql server 2014 的安装

    1.双击打开sql_server2014的安装包 2.点击弹出来的对话框的确定按钮 3.等待一会,安装包在准备中 4.弹出SQL server 安装中心,点击全新 SQL Server 独立安装 5. ...

  6. 即时聊天APP(五) - 聊天界面

    设置界面没什么好说的,无非也就是加了个对话框来二次提醒用户,现在来讲讲聊天界面. 聊天界面初始化时会得到一个参数,就是对方的id,并设置在标题栏的位置,此界面也是使用RecyclerView来展示聊天 ...

  7. js-数据交互--AJAX

    一:介绍 今天跟下大家简单的介绍一下,在前端开发中,前后端数据交互的一种手段,我们都知道,在前端往后端传送数据的话,利用get,post方法即可向后端发送数据,后端将数据接受,链接到数据库,进行数据库 ...

  8. 《Java并发编程的艺术》读书笔记

    一.并发编程的挑战 上下文切换:cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务.但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的 ...

  9. python接口测试(post,get)-传参(data和json之间的区别)

    python接口测试如何正确传参: POST 传data:data是python字典格式:传参data=json.dumps(data)是字符串类型传参 #!/usr/bin/env python3 ...

  10. 2020Pycharm安装教程!最新2020pycharm安装!如何安装Pycharm2020版本!如何安装Pycharm!如何安装2020Pycharm!2020Pycharm永久激活!

    本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...