如何解决springboot数据库查询时出现的时区差异问题

目录
  • springboot数据库查询时出现的时区差异
    • 1.在连接数据库的配置上我们添加一项
    • 2.直接在boot配置文件中增加jackson配置
  • springboot new Date()时区差8小时
  • 总结

springboot数据库查询时出现的时区差异

最近项目中使用到多数据源将MySQL库中的数据迁移到mongo库中,发现取出后的数据与原数据时间上会出现8小时的相差,

最后度娘后终于解决问题,记录一下:

网上看到了两种比较实用的方法,因为使用的springboot原因,所以我这里使用的是在配置文件application.yml中进行修改,另外其他方法网上都可以搜到,

1.在连接数据库的配置上我们添加一项

&serverTimezone=GMT%2b8
 primary:
      jdbc-url: jdbc:mysql://******:3306/***?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: ****
      password: *****
    secondary:
      jdbc-url: jdbc:mysql://*******:3306/***?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: *****
      password: ********

原格式应该是这样的:

&serverTimezone=GMT+8 这里使用%2b替换 + 号

2.直接在boot配置文件中增加jackson配置

#在application.yml中增加配置
spring:
    jackson:
        time-zone: GMT+8

这样就可以成功将时间修改成功了,还有其他方法,大家可以查阅哦

springboot new Date()时区差8小时

1 在k8s环境中,在代码中比较时间。new Date() 下相差8小时

检查宿主机 时区是 cst时区

用java代码写出controller时区发现是GMT

代码如下:

Calendar calendar = Calendar.getInstance();      
        System.out.println("目前时间:" + calendar.getTime());
        System.out.println("Calendar时区::" + calendar.getTimeZone().getID());
        System.out.println("user.timezone:" + System.getProperty("user.timezone"));
        System.out.println("user.country:" + System.getProperty("user.country"));
        System.out.println("默认时区:" + TimeZone.getDefault().getID());

输出时区是 GMT 跟宿主机还不一样,搞不定运维,自己搞把

看来还是时区搞的鬼-

1、数据库链接db添加参数 serverTimezone=Asia/Shanghai

2、springboot启动脚本添加 -Duser.timezone=GMT+08

3、jackson 全局配置

spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+8

4、jackson 注解

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringBoot时间参数处理完整解决方案

    在JavaWeb程序的开发过程中,接口是前后端对接的主要窗口,而接口参数的接收有时候是一个令人头疼的事情,这其中最困扰程序猿的,应该是时间参数的接收. 比如:设置一个用户的过期时间,前端到底以什么格式传递参数呢?时间戳?还是2019-12-01 22:13:00这种格式?还是其他格式? 今天我就来总结一下SpringBoot Web应用接口接收时间类型参数的问题解决方案. 注:目前我对Spring源码的掌握还不是很好,所以这一篇仅仅总结一下解决方法,后面感悟多了会重写一下! 示例代码请前往:ht

  • Java timezone设置和mybatis连接数据库时区设置方式

    目录 Java timezone设置和mybatis连接数据库时区设置 JVM时区设置 Mybatis Mybatis timezone问题 解决方法 Java timezone设置和mybatis连接数据库时区设置 JVM时区设置 springboot工程运行时,需要指定时区,这样获取的时间才会和系统时间相同.以下介绍方法: 1.查看当前时区 centos7以前(不含centos7) cat /etc/sysconfig/clock centos7以后(包含centos7) timedatec

  • 关于SpringBoot mysql数据库时区问题

    寻找原因 后端开发中常见的几个时区设置 第一个设置点配置文件   spring.jackson.time-zone 第二个设置点 高版本SpringBoot版本 mysql-connector-java 用的是8.X,mysql8.X的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空. 第三个设置点 mysql  time_zone变量 词义 serverTimezone临时指定mysql服务器的时区 spring.jackson.time-zone  设置spri

  • 如何解决springboot数据库查询时出现的时区差异问题

    目录 springboot数据库查询时出现的时区差异 1.在连接数据库的配置上我们添加一项 2.直接在boot配置文件中增加jackson配置 springboot new Date()时区差8小时 总结 springboot数据库查询时出现的时区差异 最近项目中使用到多数据源将MySQL库中的数据迁移到mongo库中,发现取出后的数据与原数据时间上会出现8小时的相差, 最后度娘后终于解决问题,记录一下: 网上看到了两种比较实用的方法,因为使用的springboot原因,所以我这里使用的是在配置

  • 解决Springboot整合shiro时静态资源被拦截的问题

    目录结构如下 在自己配置的ShiroConfig中已经放行了 filterChainDefinitionMap.put("/static/**", "anon"); login.ftl也引用了静态资源 <link rel="stylesheet" type="text/css" href="/logins/css/normalize.css" rel="external nofollow&q

  • 解决Springboot项目启动后自动创建多表关联的数据库与表的方案

    熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据库表,如mybatis plus.spring JPA等,但您是否有想过,若要自行构建一套更为复杂的表结构时,这种开源框架是否也能满足呢,若满足不了话,又该如何才能实现呢? 我在前面写过一篇 Activiti工作流学习笔记(

  • MyBatis查询时属性名和字段名不一致问题的解决方法

    问题 当我们数据库中的字段和实体类中的字段不一致的时候,查询会出问题 数据库字段是 pwd id name pwd 1 张三 123456 2 李四 123456 3 王五 123456 4 赵六 123456 实体类字段是 password public class User { private int id; private String name; private String password; } 查出来结果发现, password 是 null User{id=1, name='张三

  • Mybatis查询时数据丢失的问题及解决

    目录 Mybatis查询时数据丢失 经过排查得出结论 解决办法 Mybatis查询部分字段漏查问题(mysql) Mybatis查询时数据丢失 公司里的实体类和mapper文件均由mybatis逆向工程生成 之前使用myabtis查询时直接使用注解@select(......)时遇到了一个问题. 结果显示数据库查询没有问题,但是有的数据缺没有插入到指定的字段中,如下图中ID成功存储,Z40_ID,Z40_103到Z40_113均失败. 经过排查得出结论 如果数据库命名很规范比如user_name

  • 使用Oracle数据库登录时被告知用户被锁怎么解决

    在登陆时被告知test用户被锁 1.用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. 2.查看具体的被锁时间 SQL> select username,lock_date from dba_users where username='TEST'; USERNAME LOCK_DATE --------------

  • thinkPHP使用post方式查询时分页失效的解决方法

    本文实例讲述了thinkPHP使用post方式查询时分页失效的解决方法.分享给大家供大家参考,具体如下: 昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢各位大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题,也是因为刚入手thinkphp.在做项目的过程中,因为需要非常多的查询条件,如果以get方式提交表单的话,会因为url长度限制而报错,所以必须使用post方式提交表单数据,但是在分页的过程中,遇到了问题,因为thinkphp自带的分页是以a标签的形式,进

  • 数据库查询中遭遇特殊字符导致问题的解决方法

    数据库查询中的特殊字符的问题 在进行数据库的查询时,会经常遇到这样的情况:  例如想在一个用户数据库中查询他的用户名和他的密码,但恰好该用户使用的名字和密码中有特殊的 字符,例如单引号,"|"号,双引号或者连字符"&".  例如他的名字是1"test,密码是A|&900  这时当你执行以下的查询语句时,肯定会报错: SQL = "SELECT * FROM SecurityLevel WHERE UID="" 

  • 解决SpringBoot多模块发布时99%的问题

    解决SpringBoot多模块发布时99%的问题?SpringBoot发布的8个原则和4个问题的解决方案 如果使用 SpringBoot 多模块发布到外部 Tomcat,可能会遇到各种各样的问题.本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大数 SpringBoot 发布问题. SpringBoot 多模块发布的 8 大原则 1 在发布模块打包,而不是父模块上打包 比如,以下项目目录: 如果要发布 api 就直接在它的模块上打包,而

  • 完美解决因数据库一次查询数据量过大导致的内存溢出问题

    刚开始接触项目的实习生,积累经验,欢迎交流 之前做项目,遇到过一次查询数据量过大而导致的内存溢出问题,找了很多办法一直未能实际解决问题, 今天又遇到了,经过前辈的指导,终于解决了问题!! 不过此方法只在DBug启动下有效 以上这篇完美解决因数据库一次查询数据量过大导致的内存溢出问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐