我找到了很好的功能,它验证了日期String
的格式和正确性。我想将其升级为仅验证>= 1900
年。
所以这就是我发现的:
public boolean isDateValid(String date) {
try {
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
df.setLenient(false);
df.parse(date);
return true;
} catch (ParseException e) {
return false;
}
}
这是我的升级版本:
public boolean isDateValid(String date) {
try {
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
df.setLenient(false);
df.parse(date);
Integer year = Integer.parseInt(date.substring(6, 10));
if (year>= 1900)
return true;
else
return false;
} catch (ParseException e) {
return false;
}
}
所以我没有返回true,而是检查year
变量是否大于或等于1900.问题是当我使用"12-12-1xxx"
运行此函数时(编辑:或"12-12-1abc"
)。解析年NumberFormatException
到String
时会抛出int
。绝对不应该发生因为ParseException
应该先抛出,打破try {}
块。
看起来第一个列表中的验证无法正常工作,因为它接受以数字开头的每个"yyyy"
部分。然而,"12-12-xxxx"
(编辑:或"12-12-abcd"
)一切正常。
修改
在阅读时停止投票我的问题和焦点。问题非常明确:为什么新的SimpleDateFormat(" dd-MM-yyyy")。解析(" 12-12-1xxx")不会抛出ParseException?
答案 0 :(得分:2)
据我所知,从javadoc开始,SimpleDateFormat将1作为年度的有效部分,并将解析它。相反,您可以尝试使用正则表达式验证日期。您可以在Regex to validate date format dd/mm/yyyy
找到一些示例答案 1 :(得分:1)
parse
方法的文档是:
从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。
因为不需要使用整个字符串,所以" 12-12-1xxx"实际上被解析为" 12-12-1",你得到第1年的约会。
您可以使用parse方法的结果来获取年份,而不是使用子字符串。 getYear
已弃用并返回1900年的偏移量,因此您可能希望先转换为Calendar
或LocalDate
。
public boolean isDateValid(String date) {
try {
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
df.setLenient(false);
Date parsed = df.parse(date);
int year = parsed.getYear() + 1900;
if (year >= 1900)
return true;
else
return false;
} catch (ParseException e) {
return false;
}
}
答案 2 :(得分:0)
我已查看您的功能,并查找以下详细信息。
如果您将在main函数中传递 12-12-1xxx
,那么即使我打印由df.parse(date)
转换的日期输出,它也会返回false 10月10日00:00:00 GMT 2。
所以你不会随时获得解析异常,
<强>建议强>
您可以通过Exception更改ParseException,也可以使用catch for NumberFormatException,如下所示。
public boolean isDateValid(String date) {
try {
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
df.setLenient(false);
df.parse(date);
Integer year = Integer.parseInt(date.substring(6, 10));
if (year>= 1900)
return true;
else
return false;
} catch (Exception e) { // Use Exception or if you want ParseException then use below commented code
return false;
}
/*catch (NumberFormatException nfe) { // Use this if you use ParseException
return false;
}*/
}
答案 3 :(得分:0)
如果有人对代码的外观感兴趣,那么它就是:
public boolean isDateValid(String date, String format) {
if (date.length()!=format.length())
return false;
try {
DateFormat df = new SimpleDateFormat(format);
df.setLenient(false);
df.parse(date); // exception is not thrown if day and month is
// correct AND the first char of year is a digit
// so if we have correct day and correct month
// and we know the year has 4 chars we can try to parse it
Integer year = Integer.parseInt(date.substring(6, 10));
if (year>= 1900 && year<=2015) // here we know that the year is 4 digit integer
return true; // and we can limit it
else
return false;
} catch (ParseException e) {
return false;
} catch (NumberFormatException e) {
return false;
}
}