Подтвердить что ты не робот

Ошибка в 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() или я что-то не хватает?

4b9b3361

Ответ 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.