2008-08-08 143 views
26

我正在运行Tomcat应用程序,并且需要显示一些时间值。不幸的是,时间已经过去了一个小时。我看着它,发现我的默认TimeZone被设置为:Java时区搞砸了

sun.util.calendar.ZoneInfo[id="GMT-08:00", 
          offset=-28800000, 
          dstSavings=0, 
          useDaylight=false, 
          transitions=0, 
          lastRule=null] 

而不是太平洋时区。当我尝试打印默认时区的display name时,会进一步显示此消息,并且会显示“GMT-08:00”,这似乎表明它未正确设置为美国太平洋时区。我在Ubuntu Hardy Heron上运行,从Gutsy Gibbon升级。

是否有配置文件可以更新以告知JRE使用Pacific以及所有关联的夏令时信息?我的机器上的时间显示正确,所以它似乎不是操作系统范围的错误配置。


好的,这是一个更新。一位同事建议我更新我的/ etc/profile中的JAVA_OPTS以包含“-Duser.timezone = US/Pacific”,该工作正常(我也看到了CATALINA_OPTS,我也更新了它)。实际上,我只是将变化导出到变量中,而不是使用新的/ etc/profile(稍后重新启动会接受变化,我将变为黄金)。

但是,我仍然认为有一个更好的解决方案...应该有一个配置Java的地方,说什么时区它使用,或者它是如何抓住时区。如果有人知道这样的设置,这将是非常棒的,但现在这是一个体面的解决方法。


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

回答

20

这是JVM查找zoneinfo文件的一种“怪癖”。见Bug ID 6456628

最简单的解决方法是使/ etc/localtime成为正确的zoneinfo文件的符号链接。太平洋时间,下面的命令应该工作:

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

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

编辑:添加“sudo”命令。

+0

+1:我刚刚在完全更新的Ubuntu 9.10服务器上遇到了这个问题。 Sun JDK 1.6.0_15-b03,系统在美国/东部时区的安装时进行配置。/etc/localtime包含/ usr/share/zoneinfo/US/Eastern的相同内容。 Java在2010年3月15日和4月25日之间的日期产生不正确的结果。用/ usr/share/zoneinfo/US/Eastern的符号链接替换文件后,我现在可以得到正确的结果。 我很惊讶这个bug是a)仍然开放,b)影响一个完全更新的Ubuntu服务器(9.10 - Karmic)。 – 2010-03-31 22:25:08

+0

该错误在Java版本7(b72)中被记录为关闭。 – Raedwald 2013-07-20 15:37:17

0

这可能有助于仔细检查您的操作系统正在使用的时区规则。

/usr/bin/zdump -v /etc/localtime | less 

这个文件应该包含您的夏令时规则,像这样的一个2080年:

/etc/localtime Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600 

你可以用你认为你应该使用时区规则进行比较。他们可以在/usr/share/zoneinfo/中找到。

1

我有类似的问题,可能是同一个问题。然而,我的tomcat服务器运行在一个窗口框,所以符号链接解决方案将无法正常工作。

我在JAVA_OPTS中设置了-Duser.timezone=Australia/Sydney但是tomcat并不认为DST有效。作为解决方法,我将Australia/Sydney(GMT + 10:00)更改为Pacific/Numea(GMT + 11:00),以便正确显示时间,但是我很想知道实际解决方案或错误(如果有)。

22

在Ubuntu上,仅更改/ etc/localtime文件是不够的。它似乎也读取/ etc/timezone文件。最好按照instruction正确设置时区。特别是,请执行下列操作:

$ sudo cp /etc/timezone /etc/timezone.dist 
$ echo "Australia/Adelaide" | sudo tee /etc/timezone 
Australia/Adelaide 
$ sudo dpkg-reconfigure --frontend noninteractive tzdata 

Current default time zone: 'Australia/Adelaide' 
Local time is now:  Sat May 8 21:19:24 CST 2010. 
Universal Time is now: Sat May 8 11:49:24 UTC 2010. 

在我的Ubuntu,如果在/ etc /本地时间和/ etc /时区不一致,爪哇似乎读从/ etc /时区的默认时区。