如何解决java获取时间相差8小时的问题

目录
  • 三种时间差错问题:
  • 原因:
  • 解决方案:
  • 总结:都是时区问题

三种时间差错问题:

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

原因:

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

解决方案:

手动设置jvm时间:将时间改为第8时区的时间:

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

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

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

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

TimeZone tz = TimeZone.getTimeZone("ETC/GMT-8");
TimeZone.setDefault(tz);

在apprication.yml文件中配置一下数据库连接信息,url加上这么一句:
&serverTimezone=GMT%2b8

可以解决存入数据库的时间肯定是对的,本地获取的时间则未必是北京时间。将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时区。

总结:都是时区问题

三个问题对应三种场景:

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

到此这篇关于如何解决java获取时间相差8小时的问题的文章就介绍到这了,更多相关java获取时间相差8小时内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java计算两个时间相差天数的方法汇总

    问题描述: 输入:两个日期 输出:两个日期相差的天数 具体代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是分闰年和平年的,各自的天数不同 /** * date2比date1多的天数 * @param date1 * @param date2 * @return */ public static int differentDays(Date date1,Date date2) { Calendar cal

  • 如何解决java获取时间相差8小时的问题

    目录 三种时间差错问题: 原因: 解决方案: 总结:都是时区问题 三种时间差错问题: java下使用new date()获取的时间会和真实的本地时间相差8小时. 本地获取的时间没有错,存入数据库的时候时间相差8小时. 数据库时间没有错,获取到了后端,之后返回给前端相差8小时. 原因: new date()调用的是jvm时间,而jvm使用的时间默认是0时区的时间,即:和北京时间将会相差8小时. mybatis将本地的数据传入到mysql数据库服务器的时候,服务器会对数据进行检测,会把date类型的

  • 如何用java计算两个时间相差多少小时

    最近有个需求,根据两个时间,计算两个时间之间相差多少个小时. 查了一下,网上有现成的工具类 摘出自己需要的.得到下面这个 private int getDifferHour(Date startDate, Date endDate) { long dayM = 1000 * 24 * 60 * 60; long hourM = 1000 * 60 * 60; long differ = endDate.getTime() - startDate.getTime(); long hour = di

  • Java获取时间年、月、日的方法

    本文实例讲述了Java获取时间年.月.日的方法.分享给大家供大家参考.具体实现方法如下: package com.date.demo; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateDemo { public static void main(String args[]) {

  • 完美解决Java获取文件路径出现乱码的问题

    在Java中有时获取文件路径,获取的路径中存在中文或者是空格的时候,路径出现乱码.这个问题困扰了我好久,用过各种的转码都无济于事.在后来终于解决了,在这里和大家分享一下,其实也就是加一行代码的问题. 我在项目的是使用 String path = this.getClass().getClassLoader().getResource("/").getPath().substring(1); 这样来获得当前类的文件路径的.但是这样得到的是乱码.后来经过跟踪 在this.getClass(

  • Java获取时间打印到控制台代码实例

    这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 面试时有一道面试题:要求获取当时时间,并像电子手表那样打印到控制台. import java.text.SimpleDateFormat; import java.time.LocalTime; import java.util.Date; /** * 打印时间到控制台 * */ public class ConsoleTime { publi

  • PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法

    问题: php函数date("Y-n-d   H-i-s");   输出的时间与当地时间相差8个小时. 解决思路 北京时间是东8区,可能是时区问题.但是此前都没问题啊,经过google发现原来从php5.1.0开始,php.ini里加入了 date.timezone这个选项,默认情况下是关闭的,也就是显示的时间(无论用什么php命令)都是格林威治标准时间,和我们的时间(北京时间)差了正好8个小时. 在调用date()函数之前先设定时区. 方法一:date_default_timezon

  • PHP5中的时间相差8小时的解决办法

    方法1:        找到php.ini中的";date.timezone ="这行,将";"去掉,改成"date.timezone = PRC"(PRC:People's Republic of China 中华人民共和国),重启Apache,问题解决. 方法2:         在php5以及起以上的版本,要输出本地的时间(限中国),可以这么写代码: PHP代码 复制代码 代码如下: <?php      date_default_t

  • java获取时间的方法总结

    一.获取当前时间,   格式为:   yyyy-mm-dd   hh-mm-ss DateFormat.getDateTimeInstance(2, 2, Locale.CHINESE).format(new java.util.Date()); 二.获取当前时间,   格式为:   yyyy年mm月dd日   上午/下午hh时mm分ss秒DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG,   Locale.CHINE

  • php5.2时间相差8小时

    在PHP5中,在php.ini里修改 date.timezone = "Asia/shanghai" 就行了

  • Java中时间API的基本使用教程

    1. 时区概念 国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东.西各12个时区).规定英国的格林尼治天文台旧址为中时区(零时区).东1-12区,西1-12区.每个时区横跨经度15度,时间正好是1小时.最后的东.西第12区各跨经度7.5度,以东.西经180度为界.每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时.英国(格林尼治天文台旧址)为本初子午线,即零度经线. 时区的表格划分 为什么全世界不使用统一的时间 于各个地区所在地球位

随机推荐