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反转。 这是我认为大多数人都会期待的。