Java:如何严格解析日期?

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 

fmt.setLenient(false); 是你在找什么。

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 

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

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

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

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

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