2016-03-24 25 views
3

我寫了下面的程序:的Java歐洲/明斯克時區問題

import sun.security.action.GetPropertyAction; 

import java.security.AccessController; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z").format(new Date())); 
     System.out.println(TimeZone.getDefault().getDisplayName()); 

     String country =AccessController.doPrivileged(new GetPropertyAction("user.country")); 
     System.out.println(country); 

     String javaHome=AccessController.doPrivileged(new GetPropertyAction("java.home")); 
     System.out.println(javaHome); 

    } 
} 

然後我設置GMT + 3歐洲/明斯克時區我的電腦上。

如果我運行這個程序與JDK6最新版本,我看到它讓我發現,我在Java的時區爲委內瑞拉標準時間GMT + 4.30 如果我上最新的JDK7版本運行它,它讓我看到巴西的時區GMT-3 , 如果我在最新的JDK8發行版上運行它,它會顯示我莫斯科時間爲GMT + 3。如果我在我的Win7計算機上選擇伏爾加格勒格林威治標準時間+3時區,該程序可以在所有版本的Java中正確運行。那麼這是JDK與明斯克時區的錯誤嗎?

+0

獲取顯示的時區名稱的輸出可以隨JDK更改。請打印'TimeZone.getDefault()'的id(通過方法'getID()'),以啓用更好的分析,因爲顯示的區域名稱往往是矛盾的。並且還請顯示您在計算機上如何具體設置明斯克時區。你只是使用它的顯示名稱 - 或更好的ID? –

回答

0

問題是由於直到2014年沒有專門的歐洲/明斯克時區(至少在Windows中)造成的。

它只有在俄羅斯和白俄羅斯的20112014幾個DST和時區法律更改後纔出現。

查看相應的JDK-8017129JDK-8067758的問題。

這些更改已經在最新的java版本中考慮到了。 較舊的JDK和JRE可能需要通過Timezone Updater Tool進行修補。

操作系統時區設置也必須更新。在Windows中,這意味着您需要安裝KB2570791和至少KB2998527補丁程序。

還有一種替代解決方法,不需要上面提到的修補。 只需硬編碼-Duser.timezone=GMT+3在java命令行參數中需要的工具或globally。這將work fine,直到下一個法規更改。 )

但是,切換到最新的Java 8將從穩定性和性能改進中受益。