2012-07-29 18 views
2

我只是嘗試了java.util.Calendar方法getActualMaximum()以查看是否可以在給定年份的一個月內獲得最多天數。這裏是我的代碼:在java.util.Calendar中,爲什麼設置Calendar.YEAR的值會影響Calendar.MONTH的值?

public static void main(String[] args) { 
    Calendar c = Calendar.getInstance(); // today is July 29, 2012 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
    c.set(Calendar.MONTH, Calendar.FEBRUARY); // set to February 2012 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
    c.set(Calendar.YEAR, 2011); // set year to 2011, now February 2011 
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR)); 
} 

我期待的輸出是:

6 31 2012 // last day of July 2012 is 31 
1 29 2012 // last day of Feb 2012 is 29 
1 28 2011 // last day of Feb 2011 is 28 

然而,這就是我得到:

6 31 2012 
1 29 2012 
2 31 2011 // HUH? 

(在java.util.Calendar中,月份值從1月到12月的0到11開始,而月份的日子本身從1開始。)

爲什麼星期一th突然設置爲Calendar.MARCH?這裏發生了什麼,我能做些什麼才能正確地獲得給定月份和年份的最後幾天?我正在探索該方法,因爲我不想設置自己的布爾數組,對於代表31天月份的索引是真的,對於沒有的假索引是真的。

回答

2

我相信日曆記住你有多少天到一年。在2012年,你是在第31 + 29日= 2月29日。在2011年是3月1日。然後你詢問當月的實際最大值,其中(3月份)爲31.

日曆API太糟糕了。

您應該直接設置年份和月份,然後再詢問您的用例中的實際最大值。

+0

只是使用Java時使我感到挫敗的許多類之一。 – 2012-07-29 04:14:09

+0

無論如何,我最終創建了布爾數組。它比提出針對Calendar API缺點的解決方法更可靠。 – 2012-07-29 08:08:41

0

,它的發生是因爲2月29日的前一年,2012年是3月1日,2011年

0

2011年2月沒有第29天,該類自動調整爲第一個有效日期。它相信你是在2月28日之後的第一天,也就是3月1日。

相關問題