我有以下代码检查有效的格式日期
private void validateDate(String date){
try {
String validDate = "MM/dd/yyyy";
SimpleDateFormat format = new SimpleDateFormat(validDate);
format.setLenient(false);
Date theDate = new Date();
theDate = format.parse(date);
}
catch (Exception e) {
}
}
我将日期值传递给06/25/20014。在今年格式是错误的,我期待它将抛出异常并将进入内部捕获,但它永远不会发生,它成功传递代码format.parse(日期);由于我的应用程序没有抛出错误。
我还调试了行format.parse(date);它返回" Fri Jul 31 00:00:00 MST 20015"。我不确定为什么那条线没有抛出任何异常。
感谢您的帮助!!
答案 0 :(得分:0)
这实际上是documented behaviour(至少对于公历,我假设您将使用,除非您明确地将其设置为不同的日历):
年份:如果格式化程序的日历是阳历,那么 以下规则适用。
对于格式化,如果是图案的数量 字母是2,年份被截断为2位数;否则就是 解释为数字。对于解析,如果是模式字母的数量 超过2,年份按字面解释,无论如何 位数。
是的,有一天20015可能是有效的一年;)如果你想检查4位数字,你可能要考虑在解析之前使用正则表达式匹配。
答案 1 :(得分:0)
如果此行确实抛出异常,那么您的程序将在9999年后停止工作,这通常不是您想要的。当然,你不希望你的程序持续这么久,但是人们也没想到会持续到y2k;所以Java选择不在任何日期阻止它似乎是合理的。
如果您想检查年份是否在1到9999之间,您只需撰写if
:(参见相关问题I want to get Year, Month, Day, etc from Java Date to compare with Gregorian Calendar date in Java. Is this possible?)
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if (cal.get(Calendar.YEAR) > 9999)
throw new RuntimeException("Blah");
答案 2 :(得分:0)
在SimpleDateFormat的标准日期格式中,数字' y'并不一定与数字位数相对应(它不是正则表达式)。一个或两个y是2位数年份(15,98等)的指标,3个或更多y是全年的指标。
答案 3 :(得分:0)
我可以看到提供的日期是有效的(虽然提前18k年)
public static void validateDate(String date){
try {
String validDate = "MM/dd/yyyy";
SimpleDateFormat format = new SimpleDateFormat(validDate);
format.setLenient(false);
Date theDate = format.parse(date);
Calendar c = new GregorianCalendar();
c.setTime(theDate);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int pos = c.get(Calendar.DAY_OF_WEEK);
if (Calendar.WEDNESDAY == pos)
System.out.print("day is Wednesday on " + year + "/" + (month+1) + "/" + day);
}
catch (Exception e) {
System.out.print("Inside exception block " + e);
}
}
打印:日期是星期三20014/6/25
如果您需要一些年度验证,可以添加额外的检查
if (year > MAX_YEAR) {
// add error here
}
这是DEMO