java的springboot项目部署到服务器后返回结果多8个小时

本文章相关:

1.一台机器服务器端往客户端返回数据,时间自动改变,改变的时间大小一致。比如每次都加8小时。

2.jvm的时区导致时间传输不对。

3.@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") 时区转换

4.springboot代码内打印结果正确,传到浏览器就变了

正文:

我在做一个spingboot项目的时候用到了与时区相关的时间,TImeZone时区,在本地测试的时候传过来的时间与数据库一致,但是部署到服务器就不一样了,自动增加八小时。

解决步骤:

1.先debug在本地跑代码,一步一步看,打印最后返回的结果是不是与接口返回的接口一致。

2.第一步确定没有问题,然后记录下来代码里面打印的时间log日志。

比如我的遇到的:

服务器端:

数据库时间:2018-09-14 19:03:07   代码打印时间字段:Fri Sep 14 19:03:07 UTC 2018 

打印时区:sun.util.calendar.ZoneInfo[id="Etc/UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

本地:

数据库时间:2018-09-14 19:03:07   代码打印时间字段:Fri Sep 14 19:03:07 CST 2018

打印时区:

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]

然后比较:

发现服务器端与本地执行代码,取出来的时间格式不一样,本地是CST格式,服务器端是UTC格式,查一下时区CST就是北京时间即GMT+8,UTC就是GMT更精确的叫法,所以两个差8小时。

然后服务器端传出来的时候会自动把UTC时间转换成GMT+8时间,也就是时间比数据库取出来的多了8小时的原因。

技术相关:

如何打印对象: LOGGER.info(ToStringBuilder.reflectionToString("参数")+"++++++"); //提供一种Apache common的方法。

如何打印时区: LOGGER.info(TimeZone.getDefault()+"输出当前默认时区 ");//输出当前默认时区

时区代码转换:可以搜索HttpMessageConverter和注解@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")

jvm时区:1.在启动java程序时加参数-Duser.timezone=GMT+8设置  2.代码中System.setProperty("user.timezone","**");具体时区

总结:

   这里只是简述了一次修改时区转换问题的解决步骤,在真实项目中有很多时区不一致的原因,仔细检查代码先找出具体是哪一步导致的时间不一致,然后具体问题具体解决。

还可能存在时区的位置:数据库时区MySQL,jvm时区设置,服务器端linux时区设置,代码内时区设置,传输数据的两台机器时区不一致。

猜你喜欢

转载自blog.csdn.net/Mint6/article/details/82711973