Ошибка в java.time.Duration
Мне нужно разобрать Durations из строк. Java 8 предоставляет метод для принятия стандарта ISO-8601:
Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
В стандарте указано, что "разрешено опускать символ" Т "по взаимному согласию", некоторые из примеров Javadoc Durations.parse() не учитываются T
. Согласно им, следующее выражение должно анализироваться как "-6 часов и +3 минут":
"P-6H3M"
Но я обнаружил, что все выражения, опускающие T
, бросают a DateTimeParseException
. Это ошибка в методе parse()
или я что-то не хватает?
Ответы
Ответ 1
В JavaDoc parse()
:
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"
Ответ 2
Регулярное выражение, используемое 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.