0%

解决getTIme获取时间不一致问题

前言

这两天公司碰到一个问题,通过第三方传来的数据,和本地时间相差8小时。在这里记录下解决过程,思路可供大家参考。

问题定位

由于数据是第三方传来的,那么我们首先查看一下对方调用的接口,如下:

可以看到,参数中包含一个time,还有一个askVideo比较可疑。于是我们进入Service方法里,查看具体逻辑如下

首先,参数里传来的time只在checkSha1中使用,查看这个checkSha1方法可以发现,这只是一个做校验的方法,可以确定和这个time无关。
而askVideo却被反序列化成了一个AskVideo实例,并且这个AskVideo类还有个InterviewTIme的属性。并且通过getTime方法获取到了其时间戳。
首先,format.parse是把格式化的字符串转化成Date类的,应该不会出现不一致的问题。那就是getTime获取的时间戳错了?我们打个log看看:

果然,JVM的时区是UTC,也就是格林威治时间;而系统时间是CST,也就是北京时间。所以才导致getTime方法自动+8h的问题。

解决

既然知道了问题所在,解决起来也就方便了很多。

方法一

直接修改SimpleDateFormat的时区,将代码修改如下:

1
2
3
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
long interviewTime = format.parse(askVideo.getData().getInterviewTime()).getTime();

但这样有局限性,而且只是针对这里修改了,万一我别的地方也有类似的使用,那也得这样设置TimeZone,比较麻烦,所以有方法二。

方法二

直接设置JVM的时区,如下:

1
java -Duser.timezone=GMT+08 XXX.jar

一步到位。

-------------------本文结束 感谢阅读-------------------