java.time.Duration中的错误

ste*_*fen 17 java java-8 java-time

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

Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
Run Code Online (Sandbox Code Playgroud)

由于标准规定"允许通过共同协议省略'T'字符",持续时间的一些Javadoc示例中的一些例子都没有T.据他们说,以下表达式应解析为"-6小时+3分钟":

"P-6H3M"
Run Code Online (Sandbox Code Playgroud)

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

Eng*_*uad 16

JavaDocparse():

ASCII字母"T" 必须出现在第一次出现(如果有)小时,分钟节之前.

这意味着T无论何时使用H,都必须包括M,或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"
Run Code Online (Sandbox Code Playgroud)

  • "T"是必需的,因为"M"用于数月和数分钟 (8认同)
  • 我已经添加了一个JDK错误,试图修复doc bug. (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

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

"(T?(?:([-+]?[ ...
Run Code Online (Sandbox Code Playgroud)

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

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