isLenient函数检查日期是否有效

时间:2014-08-05 05:41:49

标签: java

我希望检查我设置的日期是否有效。这就是我试图这样做的方式:

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

我的问题是为什么它说它有效,即使它没有。另外,我如何检查是否是假日期?

1 个答案:

答案 0 :(得分:0)

Calendar可以是" lenient"或者"非宽松的"模式。如果它处于宽松模式,它可以接受无效值(如day = 36)并以某种方式解释它们;如果它处于非宽松模式并且您尝试设置无效值,则会抛出异常(但不一定立即;请参阅this question

isLenient会告诉您Calendar是处于宽松模式还是非宽松模式,但它不会告诉您数据是否有效。

要测试值是否有效,您可以在非宽松模式下尝试另一个Calendar。您的班级有daymonthyear字段,因此您可以尝试以下内容:

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。