2008-08-08 136 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 /時區的默認時區。