现象:
在通过部署项目到服务器时,发现服务器和本地查询结果不一致,服务器应用程序的log时间错误.
本地和服务器的log时间对比如下:
- 服务器内docker容器的应用程序(JVM)的log时间:
2018-08-21 15:23:04.188 [http-nio-10021-exec-3] INFO com.vdp.core.component.mongo.MongoService - DBName[gdcp],CollectionName[RTINFO],操作[查询query sort],查询出来的数量[0],排序[{ "TIME" : -1}],参数[{ "DEVCODE" : "LY16C1237G0001283","ShuChiCanData" : { "$exists" : false},"TIME" : { "$gte" : { "$date" : "2018-03-25T00:00:00.000Z"},"$lte" : { "$date" : "2018-03-25T00:03:00.000Z"}}}]
- 本地win10:
2018-08-21 23:22:59.380 [http-nio-10021-exec-1] INFO com.vdp.core.component.mongo.MongoService - DBName[gdcp],查询出来的数量[8],"TIME" : { "$gte" : { "$date" : "2018-03-24T16:00:00.000Z"},"$lte" : { "$date" : "2018-03-24T16:03:00.000Z"}}}]
后通过在启动jar时通过之前jvm的时区解决.
总结时区操作的如下方法:
修改centos7的时区:
查看系统的时区:
[[email protected] ~]# date Wed Aug 22 09:49:56 CST 2018
CST
是为美国、澳大利亚、古巴或中国的标准时间. 如果不是CST
那么肯定时区错误. 再查看和当前时间是否一致,如果不一致也可以判断为时区错误,可以通过如下命令修改时区:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改容器时区:
docker容器启动后,可以通过命令:docker exec -it 64163d31888d bash
进入容器,容器时区不对,通过在dockerfile添加如下配置解决:
volumes: - /etc/localtime:/etc/localtime privileged: true
完整的dockerfile实例如下:
version: ‘3‘ networks: docker_vdp-network: external: true services: dqs-servier1: image: XX.XX.187.150:8082/vdp/vdp-cloud-dqs:0.0.1 networks: - docker_vdp-network volumes: - /etc/localtime:/etc/localtime privileged: true ports: - "10021:10021"
启动jar的时候指定时区:
在我们运行应用程序时,可能JVM的时区和系统的时区不一致,那么在执行java -jar
的时候添加参数-Duser.timezone=GMT+08
.
下面的在dockerfile中启动应用程序的示例:
#docker search jdk找到的最小jdk基础镜像 FROM airdock/oracle-jdk VOLUME /tmp ADD vdp-cloud-dqs-1.0.0-SNAPSHOT.jar /app.jar EXPOSE 10021 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=GMT+08","-jar","/app.jar"]