Java是否有一个好的*严格*日期解析器?

Java是否有一个好的, 严格的日期解析器? 我可以访问Joda-Time,但我还没有看到这个选项。 我找到了“有一个很好的Java日期解析器”的问题,虽然这是相关的,但它恰恰相反。 虽然这个问题是要求一个宽松,更模糊的逻辑并且容易出现人为错误解析器,但我想要一个严格的解析器。 例如,对于JodaTime(据我所知)和simpleDateFormat,如果您的格式为“MM / dd / yyyy”:

解析这个:40/40/4353

这将成为有效日期。 我想要一个知道40是无效月份和日期的解析器。 当然,Java中存在一些这样的实现?

我没有看到Joda认为这是一个有效的日期。 例:

strict = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy") try { strict.parseDateTime('40/40/4353') assert false } catch (org.joda.time.IllegalFieldValueException e) { assert 'Cannot parse "40/40/4353": Value 40 for monthOfYear must be in the range [1,12]' == e.message } 

尽我所知, DateFormat也没有setLenient(false) 。 例:

 try { df = new java.text.SimpleDateFormat('MM/dd/yyyy') df.setLenient(false) df.parse('40/40/4353') assert false } catch (java.text.ParseException e) { assert e.message =~ 'Unparseable' } 

希望这可以帮助!

使用DateFormat进行严格validation的一种好方法是重新格式化已解析的日期并检查与原始字符串的相等性:

 String myDateString = "87/88/9999"; Date myDate = dateFormat.parse(myDateString); if (!myDateString.equals(df.format(myDate))){ throw new ParseException(); } 

奇迹般有效。