21

SimpleDateFormat是一个非常友好的解析器,它滚动生成的日期而不是抛出错误。如何在没有正则表达式等的情况下严格解析日期?

fmt = new SimpleDateFormat("dd.MM.yyyy")
fmt.parse("10.11.2012")   // it works
fmt.parse("10.1150.2012") // it works but it's unwanted
4

3 回答 3

35

fmt.setLenient(false);就是你要找的。

于 2012-10-26T13:46:42.760 回答
13

java.time

您还可以在 Java 8 及更高版本(教程)中使用java.time 包。它的解析严格检查日期值。

例如:

String strDate = "20091504";
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);

直接给出:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '20091504' could not be parsed:
Invalid value for MonthOfYear (valid values 1 - 12): 15
于 2015-06-14T14:23:57.657 回答
3

不幸的是 fmt.setLenient(false); 不会实现严格的日期格式。它可以帮助一些人,例如,如果 lenient==true,使用格式“yyyyMMdd”解析“2010-09-01”将成功,但结果非常奇怪:2009/12/09。

即使 lenient==false parse() 仍然表现得很宽松。模式“yyyy/MM/dd”允许使​​用“2010/01/5”。对于“yyyy/yyyy”模式,像“1999/2011”这样的数据分歧是可以容忍的(产生于 2011 年)。模式匹配后也允许垃圾。例如:“20100901”和“20100901andGarbage”都将匹配“yyyyMMdd”。

我编写了 SimpleDateFormat 的扩展,它强制执行严格的模式匹配。你可以在这里找到它:

SimpleDateFormat.parse() 忽略模式中的字符数

在我的版本中,format() 和 parse() 是函数的逆函数。这是我认为大多数人所期望的。

于 2016-02-05T20:07:51.460 回答