背景

今天早上刚上班,就被同事提示,程序的日期处理有问题。数据库里日期为: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时区

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

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

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,那么再加多一条配置,就可以了:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
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. Gym 100851 题解

    A: Adjustment Office 题意:在一个n*n的矩阵,每个格子的的价值为 (x+y), 现在有操作取一行的值,或者一列的值之后输出这个和, 并且把这些格子上的值归0. 题解:模拟, 分成 ...

  2. SSH项目,JSP项目,SSM项目源码附带环境安装指导视频教程

    基于java开发的一个局域网端口扫描程序下载地址:https://www.icodedock.com/article/6.html 用JAVA实现对JAVA代码的格式化下载地址:https://www ...

  3. 用户上传gif动图分解成多张帧图片,并合并生成新gif图片

    背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...

  4. 封装返回给前台的json

    JsonResult类的定义: /*生成Json串*/ public class JsonResult { /** * 返回错误状态的json串 * * @param status 错误代码,非零数值 ...

  5. SQL Server2008 并发数测试

    .Net连接SQL Server2008数据库并发数,在默认情况下是100: 上面日志记录当前连接数991,说实话第一次看到还真以为能达到如此高的并发,后头仔细一看其数值都是间隔10,所以算下来是10 ...

  6. 单点登录(两种单点登录类型:SSO/CAS、相同一级域名的SSO)

    单点登录:SSO(Single Sign On) 什么是单点登录:大白话就是多个网站共享一个用户名和密码的技术,对于普通用户来说,只需要登录其中任意一个网站,登录其他网站的时候就能够自动登陆,不需要再 ...

  7. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  8. 获取手机屏幕DisplayMetrics属性方法

    转自:http://blog.csdn.net/zhangqijie001/article/details/5894872 其他参考:http://blog.sina.com.cn/s/blog_7d ...

  9. 利用kubeadm快速部署 kubernetes 集群

    结合一下两个教程 https://www.cnblogs.com/along21/p/10303495.html 链接:https://pan.baidu.com/s/1O_pcywfso4VFOsF ...

  10. 最新2019Pycharm破解教程,附激活码!

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