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.
这意味着您必须在使用 H
、M
或 S
时包含 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"
我需要解析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.
这意味着您必须在使用 H
、M
或 S
时包含 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"