栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+MySQL时区问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+MySQL时区问题

1、问题说明

使用springboot + MySQL的项目中,经常出现前端页面展示的时间和MySQL数据库里的时间不一致的情况,致人崩溃,故花时间搞清楚之其中的原理。

2、问题分析

数据库中的时间到我们将他展示到页面上,要经过如下流程:

**数据库服务器 ——> Java代码 ——> 日期格式化(展示)

其中,有两个地方涉及到时区问题(手动配置):

  1. 服务器时区:即MySQL的时区,通过url指定serverTimezone来指定本次连接MySQL的时区,不知道时默认为系统时区

    show VARIABLES like '%time_zone%'; 
    

    这是安装MySQL默认的时区,为SYSTEM,即系统时区,国内为东八区。

    大多数情况下,这里的默认时区不一定为东八区;

    故常见操作为通过数据库连接urlserverTimezone属性来指定当前连接中数据库的时区

  2. 格式化日期时指定的时区(不通过timezone指定时区时,默认为UTC时区)

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    

当然,Java代码也有时区,但是一般我们不会去修改,而是使用默认时区东八区。

PS:

Java代码的时区指的是用Date类型来作为中间变量存储从数据库中查询出来的日期

LocalDateTime类型仅仅是一串数字的集合,不包含时区,即你给它什么,他就还给你什么,不会因为时区发生变化而改变它的值

3、解决方案 1. 使用LocalDateTime类型代替Date类型保存日期

上面也说过,LocalDateTime类型不包含时区,仅仅是一串数字的集合,故能避免时区问题

2. 统一配置时区为东八区

由于Java程序使用的时区不会发生变化(采用操作系统时区,国内一般默认为东八区),因此保证MySQL的时区以及格式化字符串指定的时区斗鱼Java程序的时区保存一致为东八区即可。

若不一致,则有一下几种情况(下图为查询操作的过程,插入操作于此相反):

对于情况1,虽然说最终页面展示的时间与数据库的时间一致,但是java代码的时间是不对的,因此也不推荐。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434899.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号