2013-07-02 69 views
7

我想使用日历方法设置年份日期和月份,但如果日期无效,例如想要显示某种指示,使用日历检查日期是否有效

calendar.set(2013,Calendar.JANUARY , 23) //is a valid date 
calendar.set(2013,Calendar.JANUARY , 33) //is not 

我设置calendar.setLenient(false)和预期值设置为33月就抛出一个异常,但事实并非如此。

回答

8

看来检查懒洋洋地完成:

非宽松的GregorianCalendar抛出时异常计算其时间或日历字段值,如果任何超出范围的字段值已设置。

因此,这将引发你的异常:

Calendar c = new GregorianCalendar(); 
c.setLenient(false); 
c.set(2013, Calendar.JANUARY, 33); 
c.getTime(); 

但并非没有getTime

+0

+1正确。日历是JDK中最破碎的类的众多原因之一。 (使用JodaTime!) – Bohemian

3

宽大只是控制日历是否接受超出日期的日期。如果宽大处理设置,Java会做一些数学来调整超出范围的日期(例如,2013-12-32变为2014-01-01)。如果没有设置宽松,Java不会允许这样做,但它不会检查超出范围的数据,除非您实际请求某些字段。从Javadocs

非宽松的GregorianCalendar抛出时异常计算其时间或日历字段值,如果任何外的范围字段值已被设定。

你的问题,然后:

如何处理呢?

您可以设置日历的第一个月:

calendar.set(2013, Calendar.JANUARY, 1); 

,然后调用

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 

和比较反对的一天价值。如果你的日值在范围内,那么你可以继续。

相关问题