[英]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.