Java Calendar如何验证日期

时间:2018-03-11 21:26:08

标签: java

我正在尝试验证一个给定的日期,但它不符合我的意愿。用户输入一个日期,它被解析并传递给一个数组,我正在尝试验证日期是一个正确的日期(考虑到闰年,二月等),而不会使代码非常冗长。

        Calendar calendar = new GregorianCalendar(getValidYear(), getValidMonth() - 1, getValidDay());


  if( validYear < 2010 )
  {
    throw new InvalidDateException("Year must be greater than 2009");
  } else {

    if(validMonth < 1 || validMonth > 12 )
    {
      throw new InvalidDateException("Month value must be greater than or equal to 1 or less than or eqaul to 12");
    } else {

      if(validDay > calendar.getActualMaximum(Calendar.DAY_OF_MONTH) || validDay <= 0)
      {
        throw new InvalidDateException(String.format ("Day value must be greater than 0 and less than or equal to %s ",
                                                       calendar.getActualMaximum(Calendar.DAY_OF_MONTH) ) );


      } 
    }//end nested if month

  }//end nested IF year

}

如果我将2018/02/33放入并打印出异常,则显示日期为2018年3月5日,我不确定这些数字的来源。解析日期的代码是

String dateGiven[] = validDate.split("/");

  validYear = Integer.parseInt(dateGiven[0]);
  validMonth = Integer.parseInt( dateGiven[1] );
  validDay = Integer.parseInt( dateGiven[2] );

当我构建字符串以显示正确打印的日期时,但它不适用于日历,我不知道我做错了什么。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

使用Java 8时间功能会更容易:

systemd.exec(5)
当日期无效时,

将导致DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate date = LocalDate.parse("2018/02/33", formatter);

DateTimeException

答案 1 :(得分:1)

Calendar默认是宽松的。引用其方法setLenient的文档:

  

通过宽松的解释,日期如“1996年2月942”将会   被视为相当于2月1日后的第941天,   通过严格(非宽大)的解释,这样的日期将导致抛出异常。默认值为lenient。

如果您希望在Calendar上设置无效日期时收到例外,请使用setLenient(false);

否则2018/02/33将被解释为2月1日后的32天,即3月5日。