现象:
在通过部署项目到服务器时, 发现服务器和本地查询结果不一致, 服务器应用程序的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],CollectionName[RTINFO],操作[查询query sort],查询出来的数量[8], 排序[{ "TIME" : -1}], 参数[{ "DEVCODE" : "LY16C1237G0001283" , "ShuChiCanData" : { "$exists" : false} , "TIME" : { "$gte" : { "$date" : "2018-03-24T16:00:00.000Z"} , "$lte" : { "$date" : "2018-03-24T16:03:00.000Z"}}}]
通过在启动jar时指定jvm的时区解决问题.
总结时区操作的如下方法:
修改centos7的时区:
查看系统的时区:
[root@localhost ~]# 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"]