??Calendar cal = Calendar.getInstance();
??cal.set(1999, 12, 31);
??System.out.println( cal.get(Calendar.YEAR) +"");

這三行代碼的執行結果是什么?

是 1999 嗎?

但是它沒有,結果是 2000。是千年蟲問題嗎?

??????? 事情比我們想象的還要糟糕:這是致命的 Date/Calendar 問題。在 Java 1.0 發布的時候,,它唯一支持的日歷計算類就是 Date 類。由于這個類有許多的問題,因此,在 1.1 版的時候,Calendar 類被添加到 Java 中,以糾正 Date 的缺點,不幸的是,問題更多了。
?
??????? 我們習慣上將第一個月當作 1,因此 12? 可以用來表示 12 月,不幸的是,Date 的月份表示從 0 開始,因此 12 月將用 11 來表示,而且 Calendar 繼續延續了這個錯誤。因此上面的代碼將月份設置為了 13 月,但是實際的月份只有 12 個月,代碼應該拋出一個異常,通知我們發生了什么,他應該這么做,可是,它沒有,它直接認為這應該是下一個月,也就是 2000 年的 1 月。因此我們上面的代碼輸出結果為 2000。

Date d = cal.getTime();
System.out.println( d.getDay());

再看這兩行代碼的結果是什么?

是 31 嗎?

結果是 1

??????? 我們在前面將日期設為了 31 日,在 cal.getTime() 中返回了一個 Date 類型的日期,這個日期也應該是 31 ,為什么是 1 呢?

??????? 還是查一下 JavaDoc 吧, Date.getDay 返回的實際上是日期的星期數,也就是返回的結果是星期幾,而不是月份中的日期。這個值從星期天開始計算,從?0 開始,因此,打印 1? 表示 2000年12月31日是星期一。注意一下吧, Calendar 的方法 get( Calendar.DAY_OF_WEEK) 不知道為什么返回的是基于 1?開始的星期日期,而不是基于 0 開始的星期日期。

??? 以上內容取自 《Java 解惑》 P144
???????