Java程序与服务器的时间问题

时区分类
UTCUniversal Time Coordinated  协调世界时 ,又称世界标准时间
GMT :Greenwich Mean Time  格林尼治平均时
CSTCST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
CETCentral European Time 欧洲中部时间
DSTDaylight Saving Time 夏日节约时间
Unix时间戳: 所看到的UTC时间那就是从1970年(1970年01月01日 0:00:00))这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。
关系大概如下:
UTC=GMT(通常)
CST=UTC+8=GMT+8
CET=UTC/GMT + 1
CST=UTC/GMT +8
CST=CET+9

查看linux的时间 date -R
查看docke容器时间 docker exec b2de5384d2ae date
确保两个时间的时区与时间是统一的

本地环境 win10+idea+jdk8
服务器环境 centeos+docker+jenkins+springboot+jdk8

场景:传入参数为字符串“2018-06-06”, java用Date接收
本地环境接收后后为 CST 时间为2018-06-06 00:00:00
服务器环境接收后为 UTC 时间为2018-06-05 16:00:00
也就是java程序默认使用UTC时间 很明显时区错了,解决方案,本帅比百度了一下,总结下来2种:
第一种:-Duser.timezone=GMT+08
第二种:设置容器时区为CST时间
第一种这句话写在哪里呢,因为项目是jenkins+docker部署,所以首先想到的是部署的脚本如下:

里面有这段代码,但是保存到数据库的日期还是少8个小时,那么这段脚本根本就没生效,所以,可不可以把这个时区的设置放到代码里面呢,答案是可以的,在springboot启动类中加入如下代码:

设置GMT+8为时区,测试后发现成功了,但是还是感觉不太舒服,毕竟这种时区的设置还是不要放到启动类里面为好,而且发现很多项目并没有这样去处理这个问题,那么肯定是有其他的方法,翻阅了公司其他类似项目,终于发现了另外一个解决方案,就是第二种解决方案,既然是docker,而spingboot里面的Dockerfile文件在项目部署的时候起到了真正的作用,截图图下:

其实就是将docker每次启动容器,会添加CST东八区时间到容器本地时间,然后再修改时区,修改时区后java程序会以修改后的时区为准。这样java程序转化数据时就会以CST时区为准。

猜你喜欢

转载自blog.csdn.net/qq_39533847/article/details/80815777