docker部署之获取当前时间误差问题

1、背景描述:

此为公众号项目的开发,其中有一个功能是飞机订舱,里面有一个细节,就是在订舱的时候在飞机起飞前三个小时不能订舱,也就是要订舱得在飞机起飞的三个小时前。要怎么实现呢?看下面代码

2、图片代码。

3、问题描述:

现在我将开发完的项目在本地启动运行,然后操作订舱这个功能,ok,完全没问题。

然后我将项目通过docker的方式部署到centos系统的服务器上,然后操作订舱这个功能,好了,问题来了。很奇怪的是像下面这个实际上不能订舱,但居然提示操作成功!!!

4、原先其实代码里面获取当前时间的类没有用calendar,而是直接用date.setHour()这个过时的方法,我以为是这个的问题,于是改成使用calendar,可是问题依然发生。本想敷衍了事,但考虑到这个项目就我一个人在开发,如果有问题也是只能自己担责,所以在边改其他bug的同时边考虑这个问题,大清早想到存在什么原因导致的,也会突然醒过来。

5、继续思考,如果不是类的问题,会不会是时区的问题?于是有了

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

这句代码,可测试过后本地是可以的,但部署到服务器上依然不行。

之后又考虑到会不会是系统时区的问题,于是有了

System.setProperty("user.timezone","Asia/Shanghai");

然并卵,没有用处。。。

检查过代码后问题不可能出现在飞机起飞时间,只可能是获取当前时间有误。

于是用date -R查了服务器上的时区,发现没问题呀。+800这个时区是对的。

但为什么还是有问题,然后不断百度之后想到会不会是数据库服务器的时区有问题,虽然觉得数据库服务器的时区最多影响dao层到数据库之间,不太可能影响前端到service层。但还是去查了一下,用date命令发现数据库服务器只有时间,没有指定时区,自以为应该就是这个问题了。于是改了时区,然后用date -R查看,+800。ok,好了,开始测试。

结果oh my god

。。。失望,还是有问题。

那么,还有什么原因呢?

考虑了很多很多,代码没有打包好,修改时区后没用重新部署等等等等。都一一试过了。。。

6、曙光初现

在测试的时候突然发现,实际能订舱的与飞机起飞的时间大概相差五个钟。那么这个五个钟有什么问题呢,问题来了,其实就是当前时间-8+3后的结果。-8就是可能是时区问题,+3是起飞前三小时所需要的计算。

在这里,毫无疑问,百分比确定就是时区问题,不可能是其他了。

7、开始琢磨时区。

经过百度后发现有什么影响时区呢,于是看到数据库连接url可以设置serverTimezone。mysql的url加属性比较清楚,但sqlServer的url加属性就不知道了,于是百度后貌似没什么结果,最后只能试一下

jdbc:sqlserver://ip地址:端口;DatabaseName=数据库名;serverTimezone=Asia/Shanghai

但实际上因为网络的问题,修改后要重新部署到服务器上需要重新打包,然后通过sftp传递上去,最尴尬的是在家网络不行。于是放弃尝试,打算明天去公司再搞。

好了,洗澡,洗澡的时候一直在琢磨究竟还有什么地方有timezone设置呢。

洗完澡沉思一会儿后想起,本地和部署到服务器上有几个地方不一样。服务器、数据库服务器、wsdl、zookeeper、Tomcat。于是第一个就百度了tomcat,果不其然,tomcat是可以设置timezone的。

而且考虑到docker的原因,可能就是tomcat的问题,于是本想试试在本地测试,但立马觉得还是直接到服务器上试试吧。于是直接进入运行中的tomcat容器修改tomcat的timezone。

按照网上的说法,我先看了tomcat的logs日志。在apache的logs日志下运行

tail -f catalina.out

发现。。。。

日志的时间全部比当前时间少了8个小时。现在明确了这个问题就是tomcat的timezone问题之后,热血特然涌上来。没错,就是你了,丫的tomcat。

要怎么去修改timezone呢。很简单,

docker exec -it shhy-tomcat/bin/bash

进入容器后,vim /root/apache什么什么版本号/bin/catalina.sh

在第一行添加JAVA_OPTS="$JAVA_OPTS -Duser.timezone=Asia/Shanghai"

。然后我保存修改:wq。然后去调试服务器上测试(这里要说明的一点是项目放一个服务器,数据库一个服务器,还有一个调试服务器是为了让我可以进入航空公司的内网进行测试,因为客户的测试都是在内网进行的)。

然后突然发现,什么,为什么还是老样子。。。。

心情有点低落后,于是想着,算了,还是重新部署看看,不然就睡觉吧,眼睛盯了一天电脑,确实很累。

8、终于,既在容器启动前就修改了tomcat的timezone,也把项目重新用docker部署起来。于是测试看看吧,然后我去,成功了!

万分激动,好了,感谢自己费脑子想了这么些天。。。。。。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180517G01IR600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励