2012-05-07 142 views
0

在下面的代碼當與JDK5運行返回不同的日期(1.5.0_09)打印java.util.Date在JDK 5和JDK 6

Fri May 03 00:00:00 GMT 3912 
5/3/12 5:30 AM 

並且當與JDK6運行(1.6.0_23)打印

Fri May 03 00:00:00 IST 3912 
5/3/12 12:00 AM 

很明顯,區別是因爲使用的時區,所以Date對象被創建。但是,當JDK升級時,這不會對現有代碼造成問題嗎?這種行爲是否記錄在某處或者我錯過了什麼?

class TimeTest { 

    public static void main(String[] args) { 

     Date d = new Date(2012, 04, 3); 
     Locale l = new Locale("en", "US",""); 
     DateFormat df= DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, l); 
     TimeZone t = TimeZone.getTimeZone("Asia/Calcutta"); 
     df.setTimeZone(t);  
     System.out.println(d); 
     System.out.println(df.format(d)); 

    } 
} 
+13

當您通過調用* deprecated *構造函數開始時,您不應該對關於不一致結果的SO報警。是的,它會導致問題,這就是它被棄用的原因。 –

+0

使用不推薦的方法本身並不是真正的理解Java版本之間不同行爲的好方法。在這種情況下,Date構造函數在兩種情況下都完全相同,不同之處在於不推薦使用的TimeZone.getTimeZone方法。 – jarnbjo

回答

4

奇怪一年3192正在興起,因爲棄用Date構造假設你使用的是2位數的一年0意思1900。它將1900添加到年份編號。

時區的差異並不是Date構造函數的錯誤。您的代碼使用TimeZone.getTimeZone("Asia/Calcutta")來獲取時區。如果該方法不識別時區字符串,則該方法爲documented作爲GMT時區返回。 Sun似乎支持Java 1.6中的更多時區。 (大多數人會認爲這是一件好事,而不是一個可移植性問題。)

我還沒有嘗試過,但下面的內容應該足以讓您避免在您請求的防區ID無法識別時使用GMT。

public TimeZone getZone(String id) { 
     TimeZone tz = TimeZone.getTimeZone(); 
     if (!tz.getID().equals(id)) { 
      throw new IllegalArgumentException("unrecognized zone " + id); 
     } 
     return tz; 
    }  

總而言之,你的代碼是打破在兩個方面:

  • 它使用過時的構造函數。
  • 它是假設getTimeZone會理解你所有的時區字符串,而這顯然不是Java 1.5的情況。