如何检查Date对象或Calendar对象是否是有效日期(实际日期)?

时间:2016-01-28 15:08:09

标签: java date datetime java-8 java-time

SimpleDateFormat课程方法:

public void setLenient(boolean lenient)
  

指定日期/时间解析是否宽松。通过宽松解析,解析器可以使用启发式来解释与该对象的格式不精确匹配的输入。通过严格的解析,输入必须与此对象的格式匹配。

Calendar班级的方法:

public void setLenient(boolean lenient)
  

指定日期/时间解释是否宽松。通过宽松的解释,例如" 1996年2月942和#34;将被视为相当于1996年2月1日之后的第941天。对于严格(非宽松)的解释,此类日期将导致例外被抛出。默认值为lenient。

检查格式的符合性或滚动日期。

我想确认带有MM-DD-YYYY(02-31-2016)的日期是否应该返回无效,因为在30日的feb不是真实日期,所以04-31-1980也应该返回无效。

不想使用Java 8中的Joda time API,但是对此的任何建议都将非常感激。

2 个答案:

答案 0 :(得分:4)

使用Java Time API,可以使用STRICT ResolverStyle

来完成
  

严格解决日期和时间的样式。

     

使用严格解析将确保所有已解析的值都在该字段的有效值的外部范围内。为了严格,可以进一步处理各个字段。

     

例如,使用严格模式解决ISO日历系统中的年月和日期将确保日期对年 - 月有效,拒绝无效值。

public static void main(String[] args) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy")
                                                   .withResolverStyle(ResolverStyle.STRICT);
    LocalDate.parse("02-31-2016", formatter);
}

此代码将抛出DateTimeParseException,因为它不是有效日期。

默认情况下,格式化程序具有SMART ResolverStyle

  

默认情况下,格式化程序具有SMART解析程序样式。

但您可以通过调用格式化程序实例上的withResolverStyle(resolverStyle)来更改此内容。

答案 1 :(得分:1)

final static String DATE_FORMAT = "dd-MM-yyyy";

public static boolean isDateValid(String date) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
}