簡體   English   中英

java.util.Date在JDK 5和JDK 6中返回不同的日期

[英]java.util.Date returning different dates in JDK 5 and JDK 6

當與JDK5(1.5.0_09)運行時,以下代碼

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));

    }
}

出現奇怪的年份3192是因為不推薦使用的 Date構造函數假定您使用的是2位數的年份,而0表示1900 它將1900添加到年份中。

時區的差異不是Date構造函數的錯誤。 您的代碼使用TimeZone.getTimeZone("Asia/Calcutta")獲取時區。 如果該方法無法識別時區字符串,則記錄為返回GMT時區。 看起來Sun ADDED在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顯然不是這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM