java.time.Duration 中的错误

Bug in java.time.Duration

我需要解析Durations from strings. Java 8 provide a method for that taking the ISO-8601标准作为依据:

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

正如标准所述,"it is permitted to omit the 'T' character by mutual agreement" Durations.parse() 的一些 Javadoc 示例省略了 T。根据他们的说法,以下表达式应解析为“-6 小时 +3 分钟”:

"P-6H3M"

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

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 之间存在不一致。

parse()JavaDoc中:

The ASCII letter "T" must occur before the first occurrence, if any, of an hour, minute or second section.

这意味着您必须在使用 HMS 时包含 T


虽然示例是错误的:

"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"