java.time.Duration中的错误

时间:2015-03-10 08:17:03

标签: java java-8 java-time

我需要从字符串中解析Durations。 Java 8提供了一种以ISO-8601标准为基础的方法:

Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour

正如标准所述,"允许省略' T'通过共同协议的特点" Durations.parse()的一些Javadoc示例遗漏了T。根据他们的说法,下面的表达式应解析为" -6小时和+3分钟":

"P-6H3M"

但我发现所有表达式都忽略了T抛出DateTimeParseException。这是parse()方法中的错误还是我遗漏了什么?

2 个答案:

答案 0 :(得分:16)

parse()的{​​{3}}:

  

ASCII字母" T" 必须小时分钟第二部分的第一次出现(如果有)之前发生。

这意味着,只要您使用THM,就必须加入S


但这些例子是错误的:

"P-6H3M"    -- parses as "-6 hours and +3 minutes"
"-P6H3M"    -- parses as "-6 hours and -3 minutes"
"-P-6H+3M"  -- parses as "+6 hours and -3 minutes"

答案 1 :(得分:11)

Duration.parse使用的正则表达式为:

private static final Pattern PATTERN =
        Pattern.compile("([-+]?)P(?:([-+]?[0-9]+)D)?" +
                "(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?",
                Pattern.CASE_INSENSITIVE);

输入P-6H3M与此正则表达式不匹配。如果改为

"(T?(?:([-+]?[ ...

在第四行(请注意?之后的T),示例匹配(在http://regexpal.com/上测试)。

所以看起来你发现代码和JavaDoc之间存在不一致。