繁体   English   中英

Java Calendar如何验证日期

[英]Java Calendar how to validate date

我正在尝试验证给定的日期,但是我不希望这样。 用户输入一个日期,然后将其解析并传递给数组,我试图验证该日期是否是正确的日期(考虑leap年,2月等),而无需使代码过长。

        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日,而Im不能完全确定这些数字的来源。 解析日期的代码是

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

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

当我构建字符串以显示日期时,它可以正确打印,但是它不适用于Calendar和Im,我不确定Im在做什么。 任何帮助表示赞赏!

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

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

当日期无效时将导致DateTimeException

java.time.DateTimeException: Invalid value for DayOfMonth (valid values 1 - 28/31): 33

默认情况下, Calendar宽大。 从其方法setLenient的文档中引用:

如果采用宽大的解释,则将诸如“ 1996年2月942年”之类的日期视为等同于1996年2月1日之后的第941天。使用严格的(非宽容)解释,这样的日期将引发异常。 默认值为宽松。

如果要在Calendar上设置无效日期时收到异常,请使用setLenient(false);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM