我在下面的代码中犯了什么错误?如果我们不传递像yyyy-mm-dd这样的日期格式,它应该抛出解析错误,并且应该返回false,但低于一个不起作用的场景
2020-08-19-->工作正常,回归正轨
2020-19-08-->这工作正常,返回false
20-08-19-->这应该返回false。它不起作用,而且正在恢复
我不明白为什么第三个场景失败了。
澄清:我在问:如果我们通过输入: 20-19-08
,它应该返回false,对吗?但它又回到了现实。我的问题是,如果我通过20而不是2020,它应该返回false。
代码
public static boolean validateDateFormat(String strDate) {
SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-MM-dd");
sdfrmt.setLenient(false);
try {
sdfrmt.parse(strDate);
}
catch (ParseException e) {
return false;
}
return true;
}
3条答案
按热度按时间atmip9wb1#
20-19-08不遵循格式,因为年份未指定为四位数(尽管您使用的格式设置程序将20和2020都识别为有效年份,只是不是同一年),并且根据格式字符串的月份值将显示为19,这是无效的。
eaf3rand2#
java.time文件
我不认为
SimpleDateFormat
能够给你所要求的验证。这是一样的,因为这个类是出了名的麻烦和过时。反正你也不该用。我建议您在所有的日期工作中使用java.time,即现代的java日期和时间api。它很好地验证了你的日期字符串。使用DateTimeFormatter.ISO_LOCAL_DATE
.试一试:
输出为:
我们也可以尝试其他字符串:
一个有效的:
为什么你的代码不起作用?
我不明白为什么第二个场景失败了有人能帮我吗
这就是路
SimpleDateFormat
解析数字。根据文件:年份:如果格式化程序
Calendar
如果是公历,则应用以下规则。…
对于解析,如果模式字母的数目大于2,则不管数字的数目是多少,年份都按字面解释。所以使用“mm/dd/yyyy”,“01/11/12”模式可以解析为公元12年1月11日。
…
我认为这个例子很符合你的情况。即使你使用
yyyy
在格式模式字符串中,SimpleDateFormat
很乐意解析20
这将解释为什么没有抛出异常,这反过来又会导致方法返回true。链接
oracle教程:date time解释如何使用java.time。
vwhgwdsa3#
您没有在catch块中抛出异常。因此它不会抛出任何简单的retyurn false。要获取实际的异常,请抛出它或printstacktrace()抛出它。
这种方法应适用于以下两种情况:
测试结果: