代码之家  ›  专栏  ›  技术社区  ›  MetroidFan2002

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

  •  11
  • MetroidFan2002  · 技术社区  · 17 年前

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

    解析这个:40/40/4353

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

    3 回复  |  直到 17 年前
        1
  •  20
  •   yawmark    17 年前

    我看不出来 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'
    }
    

    希望这能有所帮助!

        2
  •  11
  •   Rolf    16 年前

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

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

    工作起来很有魅力。