Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java有好的*严格*日期解析器吗?_Java_Datetime_Parsing_Strict - Fatal编程技术网

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

Java有好的*严格*日期解析器吗?,java,datetime,parsing,strict,Java,Datetime,Parsing,Strict,是否有一个好的、严格的Java日期解析器?我有权访问Joda Time,但我还没有看到这个选项。我发现了“Java是否有一个好的日期解析器”的问题,虽然这是相关的,但有点相反。这个问题要求的是一个宽松的、更模糊的逻辑和容易出现人为错误的解析器,而我想要一个严格的解析器。例如,对于JodaTime(据我所知)和SimpleDataFormat,如果格式为“MM/dd/yyyy”: 解析这个:40/40/4353 这将成为一个有效日期。我需要一个解析器,它知道40是无效的月份和日期。Java中确实存

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

解析这个:40/40/4353

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

我不认为这是一个有效的日期。例如:

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
}
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'
}


就我所能说的最好的情况而言,这两种情况都不存在。例如:

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
}
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进行严格验证的一个好方法是重新格式化解析的日期并检查是否与原始字符串相等:

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

工作起来很有魅力。

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

例如:

 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则表示该日期无效,否则它就是一个有效日期。此方法是使用
SimpleDataFormat
的替代方法,因为您不必依赖抛出的异常来识别该日期是否有效。

真的吗?年份当然是有效的,但至于日期和飞蛾,则不然。我必须看到这一点。如果我记得很清楚的话,额外的月份将被添加到一年中,不是吗?显然它是这样做的,它刚刚开始工作。但是,我没有能力回答这个问题。Joda time最终将添加到JavaSE中。这在头版()中有所体现:jsr310:一个新的Java日期/时间API。它说它是“主要基于Joda Time API”(@Metroid:About closing)。我想把答案标记为已接受就足够了。@Oscar:我只是在close(1)出现之前才看到close链接。我的错误。你使用的是哪一版本的JodaTime?1.6肯定表现出这种行为。这真的很奇怪。我有一个测试失败了,但由于某种原因,它现在可以工作了,我得到了你提到的那个例外。很奇怪。乔达:现在是时候了了解DateFormat很好(这里有很多东西,很难找到您正在寻找的特定方法),但我喜欢JodaTime,因为它与格式化程序实例没有任何同步问题。对于DateFormat来说,这是一个真正的问题。如果输入的日期或月份没有前导零(渲染会添加前导零),它将如何处理?如果渲染是由格式化程序完成的(就像它应该做的那样),那么绝对没有问题。如果创建外部渲染格式化程序,里程可能会有所不同。