Java时区混乱不堪

我正在运行一个Tomcat应用程序,需要显示一些时间值。不幸的是,休息一小时的时间就到了。我查看了一下,发现我的默认时区设置为:

sun.util.calendar.ZoneInfo[id=“GMT-08:00”,
偏移量=-2880000,
DST=0,
useDaylight=false,
转换=0,
lastRule=null]

而不是太平洋时区。当我试图打印默认时区的显示名称时,会进一步指出这一点,它显示为“GMT-08:00”,这似乎表明它没有正确设置为美国太平洋时区。我在Ubuntu Hardy Heron上运行,它是从勇敢的长臂猿升级而来的

我是否可以更新一个配置文件,告诉JRE使用Pacific和所有相关的夏令时信息?我机器上的时间显示正确,因此它似乎不是操作系统范围内的错误配置


好的,这里有一个更新。一位同事建议我在我的/etc/profile中更新JAVA_选项,以包括“-Duser.timezone=US/Pacific”,这很有效(我还看到了CATALINA_选项,我也更新了它)。事实上,我只是将更改导出到变量中,而不是使用新的/etc/profile(稍后重新启动将获得更改,我将获得成功)

然而,我仍然认为有一个更好的解决方案。。。Java应该有一个配置,说明它正在使用什么时区,或者它是如何获取时区的。如果有人知道这样的环境,那就太棒了,但现在这是一个不错的解决办法


我使用的是1.5,这绝对是DST的问题。如您所见,时区设置为不使用夏令时。我的看法是,它通常设置为-8偏移量,而不是特定的太平洋时区。由于generic-8 offset没有夏令时信息,它当然没有使用它,但问题是,当它启动时,我应该告诉Java在哪里使用太平洋时区?我不是在寻找一个编程解决方案,它应该是一个配置解决方案

JVM查找zoneinfo文件的方式有一个“怪癖”。请参阅错误ID 6456628

最简单的解决方法是将/etc/localtime作为指向正确zoneinfo文件的符号链接。对于太平洋时间,以下命令应起作用:

sudo cp/etc/localtime/etc/localtime.dist
#sudo ln-fs/usr/share/zoneinfo/America/Los_Angeles/etc/localtime

我对符号链接方法没有任何问题

编辑:在命令中添加“sudo”

发表评论