Java:如何严格解析日期?

时间:2012-10-26 13:44:41

标签: java validation parsing date

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

3 个答案:

答案 0 :(得分:32)

fmt.setLenient(false);正是您要找的。

答案 1 :(得分:11)

java.time

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

例如:

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

答案 2 :(得分:2)

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

即使lenient == false parse()仍然行为宽松。 " 2010/01/5#34;允许使用模式" yyyy / MM / dd"。数据分歧如" 1999/2011"对于模式" yyyy / yyyy"是容忍的(屈服于2011年)。模式匹配后也允许使用垃圾。例如:" 20100901"和" 20100901和垃圾"将匹配" yyyyMMdd"。

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

SimpleDateFormat.parse() ignores the number of characters in pattern

在我的版本格式()和parse()中是功能反转。这是我认为大多数人都会期待的。