Java时区混乱不堪
我正在运行一个Tomcat应用程序,需要显示一些时间值。不幸的是,休息一小时的时间就到了。我查看了一下,发现我的默认时区设置为:Java时区混乱不堪,java,linux,timezone,Java,Linux,Timezone,我正在运行一个Tomcat应用程序,需要显示一些时间值。不幸的是,休息一小时的时间就到了。我查看了一下,发现我的默认时区设置为: sun.util.calendar.ZoneInfo[id="GMT-08:00", offset=-28800000, dstSavings=0, useDaylight=false,
sun.util.calendar.ZoneInfo[id="GMT-08:00",
offset=-28800000,
dstSavings=0,
useDaylight=false,
transitions=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文件的一个“怪癖”。看 最简单的解决方法是将/etc/localtime作为指向正确zoneinfo文件的符号链接。对于太平洋时间,以下命令应起作用:
# sudo cp /etc/localtime /etc/localtime.dist
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
我对符号链接方法没有任何问题
编辑:在命令中添加“sudo”。仔细检查操作系统使用的时区规则可能会有所帮助
/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/中找到。我有一个类似的问题,可能是同一个问题。但是,我的tomcat服务器在windows机箱上运行,因此符号链接解决方案无法工作
我在
JAVA_OPTS
中设置了-Duser.timezone=Australia/Sydney
,但是tomcat无法识别DST是否有效。作为一种解决方法,我将澳大利亚/悉尼(GMT+10:00)改为太平洋/努美阿(GMT+11:00),这样时间会正确显示,但是我想知道实际的解决方案或错误,如果有的话。在Ubuntu上,仅仅更改/etc/localtime文件是不够的。它似乎也在读取/etc/timezone文件。最好按照指示正确设置时区。具体而言,请执行以下操作:
$ 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/localtime和/etc/timezone不一致,Java似乎从/etc/timezone读取默认时区。添加一个对我有用的简短答案,您可以使用
timedatectl
设置时区。然后重新启动JVM
sudo timedatectl设置时区UTC
+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的符号链接后,我现在得到了正确的结果。我很惊讶这个错误a)仍然存在,b)影响一个完全更新的Ubuntu服务器(9.10-Karmic)。这个错误在Java版本7(b72)中被记录为关闭。将/etc/localtime更改为符号链接;您可能希望在更现代的Linux系统中打破一些东西(例如,当软件包升级时,或者可能在启动时——我怀疑从符号链接更改为文件副本的原因可能与启动顺序和依赖性有关(特别是如果/usr/位于不同的文件系统上)。我发现设置TZ环境变量更有用。在Ubuntu10.0.4 LTS上运行起来很有魅力。也有点好。我只是简单地运行了sudo dpkg reconfigure tzdata,并可以在前端选择正确的时区。dpkg-reconfigure tzdata正是我想要的。谢谢!刚刚在lubuntu 16.04(gnome)中遇到这个问题.这个解决方案很有效。