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
答案 0 :(得分:32)
fmt.setLenient(false);
正是您要找的。 p>
答案 1 :(得分:11)
您还可以在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()中是功能反转。这是我认为大多数人都会期待的。