Java 程序读取Mysql数据库时间信息,与真实时间相差 13 小时

问题

Java后台程序读取数据库时间,在前端页面进行展示的时候,出现了错误,展示的时间和数据库中的时间不一致。

所用工具及其版本如下

  1. Mysql 数据库版本: 8.0.15 for osx 10.14
  2. 数据库里的时间类型: dateTime
  3. JDK版本:11.0.2
  4. Mysql 驱动:mysql-connector-java 8.0.16
  5. 数据源:com.alibaba.druid 1.1.19
  6. Java 项目里,时间类型:joda-time 2.10.2 的  DateTime

排查原因

最开始排查原因,是不是从数据库读取时间之后进行转化出错了,因为为了在前端进行时间展示,我将数据库读取出来的时间先转化为了字符串,再转化为DateTime的时间格式。开始进行测试:

11 DateTime now = DateTime.now(); 22 System.out.println(now); 33 44 String nowStr = now.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")); 55 System.out.println(nowStr);

输出为:

11 2019-09-03T11:15:23.749+08:00 22 2019-09-03 11:15:23

可以看到 DateTime 的输出时间格式是很标准的,后面还加上了“+08:00”,代表了东八区北京时间。转化为字符串的显示也是正确的。

下一步排查数据库的读取是否正确,在终端进入数据库,发现数据库里的时间和终端读取出来的时间一致。

那看来只能是项目代码从数据库中读取数据出错了。将时间信息反复修改观察程序读取出来的时间信息,发现程序读取出来的时间是种要比数据库写入的时间多 13 小时。整整 13 小时。这是什么原因,就算是用的格林威治标准时间那也应该差 8 小时或者 15 小时吧,这个 13 小时是个什么原因。难道是和西五区时间做了计算吗?

再在网上搜索一下,最后在这篇文章中找到了答案。原因就是Java和Mysql协商时区时把 Mysql 的 CST 时间以美国中部时间:UTC-5 当做标准,而我们用的是东八区的北京时间 UTC+5,所以我从数据库中读取的 UTC-5 时间到了Java 程序里就自动转化为 UTC+8 时间,也就比数据库里的时间多了 13 个小时。

解决方法

在数据库配置文件里面,在连接字符串中设置时区:

1 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/yourDB?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8。

这样程序在从数据库读取时间的时候,时间默认就是使用的东八区的时间,而不是使用数据库的西五区时间了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

Django之Django模板

1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:

Java 程序读取Mysql数据库时间信息,与真实时间相差 13 小时 - HelloWorld