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

时间:2009-01-28 21:47:38

标签: java datetime parsing strict

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

解析:40/40/4353

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

3 个答案:

答案 0 :(得分:21)

我没有看到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
}



尽我所知,DateFormatsetLenient(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'
}

希望这有帮助!

答案 1 :(得分:11)

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

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

像魅力一样。

答案 2 :(得分:0)

如果不想使用apache.commons.validator.routines.DateValidator,则可以使用SimpleDateFormat来验证日期。

示例:

 public static Date validateDate(String value, String pattern) {
       DateValidator validator = new DateValidator();
       Date date = null;
           if (pattern!=null) {    //Pattern is passed
               date = validator.validate(value, pattern);
           } else {
               date = validator.validate(value);
           }
       return date;
    }

因此,如果返回 null ,则意味着该日期无效,否则它是有效日期。此方法是使用SimpleDateFormat的替代方法,因为您不必依靠抛出异常来确定它是否是有效日期。