在Docker容器内运行的JVM实例(主机和容器均为Cent OS 6.5)中当前时区未正确确定时,遇到问题。
首先我已经通过-v /etc/localtime:/etc/localtime:ro
映射了etc/localtime
到子容器-v /etc/localtime:/etc/localtime:ro
(我认为这是一种普遍的方式 )
当我通过SSHlogin主机和容器
date-u
打印Mon Apr 20 11:48:57 UTC 2015
和
date
打印Mon Apr 20 14:50:41 MSK 2015
然而在JVM中
System.out.println(new Date());
我得到Mon Apr 20 11:52:24 UTC 2015
内部容器和Mon Apr 20 14:53:17 MSK 2015
主机内。
现在的时区是如何确定的?
Oracle常见问题解答并没有说明问题 ,我不太清楚Java使用什么指标来获取当前用户的时区
我的操作系统的时区修补程序是否修复了Java平台的时区数据?
不可以。Java SE平台的时区数据不从本地或主机操作系统读取。 Java SE平台作为Java Runtime Environment(JRE)软件的一部分,在本地安装的文件(… / jre / lib / zi)中维护时区数据的私有存储库。 应用任何操作系统时区补丁(例如Solaris OS,Linux,Windows)都不会影响Java SE平台时区数据的准确性。
更新:如果有人对解决方法感兴趣 – 我已经在Stephen的回答中指定了TZ环境variables,所以现在使用参数创build容器
-v / etc / localtime:/ etc / localtime:ro -e“TZ =欧洲/莫斯科”
根据这个页面 ,运行在Linux上的JVM使用TZ环境变量给它一个本地时区的名字。
页面继续解释TZ通常在“/ etc / profile”中设置,如果使用不“源”该文件的机制启动Java,它将不起作用。
Oracle FAQ引用的时区数据有所不同。 JVM用于从时区名称映射到相应的区域偏移(考虑夏令时调整等)的数据。