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

时区分类

UTC:Universal Time Coordinated协调世界时,又称世界标准时间

GMT:Greenwich Mean Time格林尼治平均时

CST:CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间:

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

CET:Central European Time欧洲中部时间

DST:Daylight 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时区为准。

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

扫码关注云+社区

领取腾讯云代金券