??Calendar cal = Calendar.getInstance();
??cal.set(1999, 12, 31);
??System.out.println( cal.get(Calendar.YEAR) +"");
這三行代碼的執(zhí)行結(jié)果是什么?
是 1999 嗎?
但是它沒(méi)有,結(jié)果是 2000。是千年蟲(chóng)問(wèn)題嗎?
??????? 事情比我們想象的還要糟糕:這是致命的 Date/Calendar 問(wèn)題。在 Java 1.0 發(fā)布的時(shí)候,,它唯一支持的日歷計(jì)算類(lèi)就是 Date 類(lèi)。由于這個(gè)類(lèi)有許多的問(wèn)題,因此,在 1.1 版的時(shí)候,Calendar 類(lèi)被添加到 Java 中,以糾正 Date 的缺點(diǎn),不幸的是,問(wèn)題更多了。
?
??????? 我們習(xí)慣上將第一個(gè)月當(dāng)作 1,因此 12? 可以用來(lái)表示 12 月,不幸的是,Date 的月份表示從 0 開(kāi)始,因此 12 月將用 11 來(lái)表示,而且 Calendar 繼續(xù)延續(xù)了這個(gè)錯(cuò)誤。因此上面的代碼將月份設(shè)置為了 13 月,但是實(shí)際的月份只有 12 個(gè)月,代碼應(yīng)該拋出一個(gè)異常,通知我們發(fā)生了什么,他應(yīng)該這么做,可是,它沒(méi)有,它直接認(rèn)為這應(yīng)該是下一個(gè)月,也就是 2000 年的 1 月。因此我們上面的代碼輸出結(jié)果為 2000。
Date d = cal.getTime();
System.out.println( d.getDay());
再看這兩行代碼的結(jié)果是什么?
是 31 嗎?
結(jié)果是 1
??????? 我們?cè)谇懊鎸⑷掌谠O(shè)為了 31 日,在 cal.getTime() 中返回了一個(gè) Date 類(lèi)型的日期,這個(gè)日期也應(yīng)該是 31 ,為什么是 1 呢?
??????? 還是查一下 JavaDoc 吧, Date.getDay 返回的實(shí)際上是日期的星期數(shù),也就是返回的結(jié)果是星期幾,而不是月份中的日期。這個(gè)值從星期天開(kāi)始計(jì)算,從?0 開(kāi)始,因此,打印 1? 表示 2000年12月31日是星期一。注意一下吧, Calendar 的方法 get( Calendar.DAY_OF_WEEK) 不知道為什么返回的是基于 1?開(kāi)始的星期日期,而不是基于 0 開(kāi)始的星期日期。
??? 以上內(nèi)容取自 《Java 解惑》 P144
???????