我正在尝试验证一个给定的日期,但它不符合我的意愿。用户输入一个日期,它被解析并传递给一个数组,我正在尝试验证日期是一个正确的日期(考虑到闰年,二月等),而不会使代码非常冗长。
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] );
当我构建字符串以显示正确打印的日期时,但它不适用于日历,我不知道我做错了什么。任何帮助表示赞赏!
答案 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日。