docker容器修改时区(java应用log信息与标准容器时间有八个小时时间差)

  在docker容器中运行的java应用打出的日志时间和通过date -R方式获取的容器标准时间有八个小时时间差~

  因为docker容器的原生时区为0时区,为了和国内时区保持一致,需要把容器时区调为东八区,方法非常简单,在/usr/share/zoneinfo目录下面有大量的时区文件,涵盖各个时区,根据自己的需求直接把对应的文件拷贝到/etc目录下,重命名为localtime文件即可。

  

  随后发现一个问题,虽然docker容器的时区已经修改为东八区了,但是容器中的java应用打出的log日志时间仍然和上海时间有很大的时间差,因此,写了一段代码来测试

import java.sql.Timestamp;
import java.util.TimeZone;

public class test {

    public static void main(String [] args){
        TimeZone tz = TimeZone.getDefault();
        System.out.println("tz: " + tz);
        Timestamp curTime = new Timestamp(System.currentTimeMillis());
        System.out.println("时间: " + curTime);
    }

}

  发现结果为:

 

  结果显示java程序输出的是洛杉矶时区的时间,说明java并没有直接从docker容器中获取时间。这种情况有两种解决方案:

一 、使用TZ环境变量,然后再运行Java程序

  export TZ=Asia/Shanghai(写到/etc/profile文件中然后重启系统生效)

  再运行java测试程序,结果变为

 

二、使用 -Duser.timezone=GMT+08 作为Java虚拟机的系统参数

 

posted @ 2017-03-01 14:36  桥er桑  阅读(...)  评论(...编辑  收藏