[英]validation to check date formatting is not working as expected
我有以下代码检查有效格式日期
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。 在今年,格式是错误的,我期望它会抛出异常并进入catch内,但它从未发生,并且成功地通过了代码format.parse(date);。 由于该原因,我的应用程序未引发错误。
我还调试了format.parse(date); 并返回“ Fri Jul 31 00:00:00 MST 20015”。 我不确定为什么该行没有引发任何异常。
谢谢你的帮助!!
这实际上是记录在案的行为 (至少对于公历来说,除非您明确将其设置为其他日历,否则我认为您将使用该行为):
年:如果格式化程序的日历为公历,则将应用以下规则。
对于格式设置,如果图案字母的数量为2,则年份将被截断为2位; 否则,将其解释为数字。 对于解析, 如果模式字母的数量大于2,则将按字面意义解释年份,而不考虑数字的数量 。
是的,有一天20015可能是一个有效的年份;)如果要检查4位数字,则可能需要考虑在解析之前使用正则表达式匹配。
如果此行确实引发了异常,则您的程序将在9999年之后停止工作,而这通常不是您想要的。 当然,您不希望程序能够持续这么长时间,但是人们也不希望程序能够持续到y2k。 因此,Java选择不禁止访问似乎是合理的。
如果要检查年份在1到9999之间,则只需编写一个if
:(请参阅相关问题, 我想从Java Date中获取Year,Month,Day等以与Java中的公历日期进行比较。 ? )
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if (cal.get(Calendar.YEAR) > 9999)
throw new RuntimeException("Blah");
在SimpleDateFormat的标准日期格式中,数字y不一定与数字位数相对应(它不是正则表达式)。 一个或两个y是2位数字年份的指标(15、98等),而3个或更多y是全年的指标。
我可以看到提供的日期是有效的(尽管提前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
}
这是演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.