我想使用日曆方法設置年份日期和月份,但如果日期無效,例如想要顯示某種指示,使用日曆檢查日期是否有效
calendar.set(2013,Calendar.JANUARY , 23) //is a valid date
calendar.set(2013,Calendar.JANUARY , 33) //is not
我設置calendar.setLenient(false)
和預期值設置爲33月就拋出一個異常,但事實並非如此。
我想使用日曆方法設置年份日期和月份,但如果日期無效,例如想要顯示某種指示,使用日曆檢查日期是否有效
calendar.set(2013,Calendar.JANUARY , 23) //is a valid date
calendar.set(2013,Calendar.JANUARY , 33) //is not
我設置calendar.setLenient(false)
和預期值設置爲33月就拋出一個異常,但事實並非如此。
看來檢查懶洋洋地完成:
非寬鬆的GregorianCalendar拋出時異常計算其時間或日曆字段值,如果任何超出範圍的字段值已設置。
因此,這將引發你的異常:
Calendar c = new GregorianCalendar();
c.setLenient(false);
c.set(2013, Calendar.JANUARY, 33);
c.getTime();
但並非沒有getTime
。
寬大隻是控制日曆是否接受超出日期的日期。如果寬大處理設置,Java會做一些數學來調整超出範圍的日期(例如,2013-12-32變爲2014-01-01)。如果沒有設置寬鬆,Java不會允許這樣做,但它不會檢查超出範圍的數據,除非您實際請求某些字段。從Javadocs:
非寬鬆的GregorianCalendar拋出時異常計算其時間或日曆字段值,如果任何外的範圍字段值已被設定。
你的問題,然後:
如何處理呢?
您可以設置日曆的第一個月:
calendar.set(2013, Calendar.JANUARY, 1);
,然後調用
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
和比較反對的一天價值。如果你的日值在範圍內,那麼你可以繼續。
+1正確。日曆是JDK中最破碎的類的衆多原因之一。 (使用JodaTime!) – Bohemian