三种时间差错问题:

  1. java下使用new date()获取的时间会和真实的本地时间相差8小时。
  2. 本地获取的时间没有错,存入数据库的时候时间相差8小时。
  3. 数据库时间没有错,获取到了后端,之后返回给前端相差8小时。

原因:

  1. new date()调用的是jvm时间,而jvm使用的时间默认是0时区的时间,即:和北京时间将会相差8小时。
  2. mybatis将本地的数据传入到mysql数据库服务器的时候,服务器会对数据进行检测,会把date类型的数据自动转换为mysql服务器所对应的时区,即0时区,所以会相差8小时。
  3. springboot中对加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默认是Json格式,
    所以,对date类型的数据,在返回浏览器端时,会被springboot默认的Jackson框架转换,而Jackson框架默认的时区GMT(相对于中国是少了8小时)。所以最终返回到前端结果是相差8小时

解决方案:

  1. 手动设置jvm时间:将时间改为第8时区的时间:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

温馨提示:如果是springboot项目,可以面向切面加上这个,或者启动main类上加上如下代码:

@PostConstructvoid started() {TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));}

注意:不要用下面方式,这个方式是错的,GMT-8最后获取的时区还是0时区的。网上很多的教程说的是下面的方式,亲测不行。

TimeZone tz = TimeZone.getTimeZone("ETC/GMT-8");
TimeZone.setDefault(tz);
  1. 在apprication.yml文件中配置一下数据库连接信息,url加上这么一句:
    &serverTimezone=GMT%2b8

    可以解决存入数据库的时间肯定是对的,本地获取的时间则未必是北京时间。
  2. 将spring的json构造器的时区改正即可,在application.yml文件中添加:

    或者可以使用注解,在entity实体类的date数据上添加注解,那么数据库传回的data数据要转换为json格式的时候就是北京时间了,再次传回到前端的时候,也不会出现时区问题。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")private Date lastTime;

不过,指的注意的是:这样做,如果你的jvm时间依然是后台0时区的,那么后台要用时间执行逻辑的时候,就要注意了,时间依然相差8小时,还是建议用第一方法,直接整个jvm改为北京的8时区。

总结:都是时区问题

三个问题对应三种场景:

  1. 后台要存时间到数据库的时候:用方法2解决本地时间和数据库时间的问题;本质是sql的服务器时区是0时区导致。
  2. 后台要使用本地时间的时候,改变jvm的时区;本质是jvm的时区是0时区导致。
  3. 后台返回数据到前端的时候出现时区问题,用注解或者yml中配置json生成器解决转换格式的问题。本质是json的构造器用的时区是0时区导致。

java获取时间相差8小时的问题及解决方式相关推荐

  1. win服务器时间自动变慢8小时,Deepin 20.2和Windows双系统时间相差8小时的原因及解决方法...

    本文帮助你搞定安装Deepin 20.2和Windows做双系统时间相差8小时的问题,将解释产生该问题的原因及提供解决方法.如不做调整,在Windows下会慢8小时,而Deepin 20.2下则会快8 ...

  2. 解决.net6 Docker容器 DateTime.Now 获取时间相差8小时问题

    2022.09.30 补充说明 在容器构建阶段指定时区是更靠谱且更有效的处理方式,如果方便删除原有容器重新构建新的容器,在构建命令中写入以下配置语句: -e TZ=Asia/Shanghai 若不方便 ...

  3. PHP5时间相差八小时问题[三种方法]

    from:http://show.xoyo.com/php/article/135713.shtml 打开php.ini,的确有一项: [Date] ; Defines the default tim ...

  4. Java 与 Mysql 时间相差八小时

    Java 与 Mysql 时间相差八小时 在项目中发现,Java获取时间插入到数据库少了8小时 解决过程 最终解决方案 在项目中发现,Java获取时间插入到数据库少了8小时 其实初衷是想做定时去跑我需 ...

  5. 机器时区导致Java时间与当前时间相差13小时的解决方案

    在机器使用date命令获取的时间与当前时间一致,但在Java中去获取时间相差了13个小时,这很可能就是机器的时区不太满足当前需要,这时候可以在Java中获取一下时区: 测试机器时区 import ja ...

  6. centos java 时间差8个小时_解决Centos7本机时间与实际时间相差8小时

    GPS系统中有两种时间区分,UTC就0时区的时间,CTS为本地时间,如北京为早上八点(东八区),UTC时间比北京时晚八小时; CTS:China Standard Time,UTC+8:00 中国沿海 ...

  7. php 获取当前时间相差12小时_php时间戳转换差8小时问题

    PHP时间大的来分有两种,一是时间戳类型(1228348800),二是正常日期格式(2008-12-4) 所以存到数据库也有两种形式了(真正不止,我的应用就两种),时间戳类型我是保存为字符串的,这个是 ...

  8. Eclipse时区出问题,与北京时间相差八小时

    Eclipse时区出问题,与北京时间相差八小时,有如下图两种情况: 情况1:Eclipse本身时间不对 情况2:用java方法获取系统时间出错 **************************** ...

  9. linux时间跳变影响,Linux起用夏令时,跳变后导致容器日志时间和系统时间相差一小时...

    Linux启用夏令时,跳变后导致容器日志时间和系统时间相差一小时 日志时间与系统时间相差一小时解决方案 一. 分析 2007年10月分,夏令时曾经做更改,2007年与之前发布的jdk版本均有此问题,2 ...

最新文章

  1. 就微软启动盗版系统黑屏的个人看法
  2. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
  3. Chrome 浏览器降级后浏览网站不保留用户数据问题原因及解决方法
  4. BeyondCompare如何去掉时间戳的匹配(不比较时间)(没解决)
  5. python基本算法语句_Python中基本且又常用的算法
  6. spring boot—默认日志框架配置
  7. wps的excel中的单元格限定输入的内容
  8. 自动建议下拉菜单_word排版技巧:如何撤销删除自动编号
  9. 对于有一定编程基础的学生来说,看下面这个链接的文章比较好
  10. 19.1.27 laravel框架学习笔记
  11. UVAlive3662 Another Minimum Spanning Tree 莫队算法
  12. IBM ThinkPad SL400 XP驱动
  13. 还在为毕业答辩的 PPT 样式苦恼?有了这个哇塞的插件,做个 PPT 真的 So easy!
  14. 【工作小结】手机WIFI网络抓包的几种方法
  15. c语言取地址和间接引用
  16. 华三F100 系列防火墙 - 浮动路由联动NQA 实现双线路自动切换
  17. wordpress主题模板开发制作教程
  18. Python分解质因数
  19. 计算机里的文件夹可以加密吗,如何加密电脑中的文件夹
  20. MyBatis 关联查询(一对多 多对一)

热门文章

  1. 关于SQL注入,绕过逗号过滤
  2. linux环境(centos7)编辑文件如何显示行号
  3. linux 日历服务器,使用linux的cal命令显示日历
  4. java计算机毕业设计公立医院绩效考核系统(附源码、数据库)
  5. 我的世界java怎么变速_我的世界变速齿轮是什么怎么用
  6. 年终考核 对你的上司,你是如何评价的
  7. JS:关于事件触发机制
  8. HLK-W801wifi连接
  9. Biopython 安装
  10. Java从小白到大牛第1篇 Java基础-关东升-专题视频课程