我希望检查我设置的日期是否有效。这就是我试图这样做的方式:
public boolean validDate() {
return calendar.isLenient();
}
这样称呼:
Date date = new Date(36, 04, 2014);
System.out.println("Day = " + date.getDay());
System.out.println("Month = " + date.getMonth());
System.out.println("Year = " + date.getYear());
System.out.println("Is valid? = " + date.validDate());
System.out.println("Last day? = " + date.LastDayOfMonth(02));
然后它返回 -
Day = 36
Month = 4
Year = 2014
Is valid? = true
Last day? = false
我的问题是为什么它说它有效,即使它没有。另外,我如何检查是否是假日期?
答案 0 :(得分:0)
Calendar
可以是" lenient"或者"非宽松的"模式。如果它处于宽松模式,它可以接受无效值(如day = 36)并以某种方式解释它们;如果它处于非宽松模式并且您尝试设置无效值,则会抛出异常(但不一定立即;请参阅this question。
isLenient
会告诉您Calendar
是处于宽松模式还是非宽松模式,但它不会告诉您数据是否有效。
要测试值是否有效,您可以在非宽松模式下尝试另一个Calendar
。您的班级有day
,month
和year
字段,因此您可以尝试以下内容:
public boolean validDate() {
try {
Calendar tempCal = Calendar.getInstance();
tempCal.setLenient(false);
tempCal.set(Calendar.MONTH, month);
tempCal.set(Calendar.YEAR, year);
tempCal.set(Calendar.DAY_OF_MONTH, day);
tempCal.get(Calendar.MONTH);
// throws ArrayIndexOutOfBoundsException if any field is invalid; we don't care about the
// method result
return true;
} catch (ArrayIndexOutOfBoundsException | IllegalArgumentException e) {
return false;
}
}
请注意,这不会影响可能仍处于宽松模式的calendar
字段。
编辑:现已通过测试。如果任何数据无效,javadoc说get()
抛出ArrayIndexOutOfBoundsException
,但我相信这可能是javadoc中的一个错误。我会尝试将此报告给Oracle。