本文章相关:
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时区设置,代码内时区设置,传输数据的两台机器时区不一致。