Ошибка в java.time.Duration

17

Мне нужно проанализировать Длительность из строк. 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 , бросают DateTimeParseException . Это ошибка в методе parse() или мне что-то не хватает?

    
задан steffen 10.03.2015 в 09:17
источник
  • Я думаю, что цитата о «взаимном согласии» относится только к «Т» в комбинированном представлении с датой, а не в представлении «Длительность». –  RealSkeptic 10.03.2015 в 09:34

2 ответа

16

В 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"
    
ответ дан Eng.Fouad 10.03.2015 в 09:29
  • Лично мне бы хотелось, чтобы метод принимал строки типа «p1d1h» в течение 25 часов (без T). Строки продолжительности в файлах конфигурации были бы очень легко читаемыми (например, «1d1h»): предварительная подготовка P проста, но добавление T в строку не является тривиальным. Представьте, что метод начинает принимать недели и наносекунды в Java 9. Где бы вам пришлось поместить T в строку «1w1m1s1n». –  steffen 10.03.2015 в 09:40
  • @steffen T означает временные разделы, поэтому он должен быть всегда до H и после D. –  Eng.Fouad 10.03.2015 в 09:50
  • Да, но оба H и D могут быть опущены. –  steffen 10.03.2015 в 09:53
  • «T» требуется, потому что «M» используется в течение нескольких месяцев и минут –  JodaStephen 10.03.2015 в 10:09
  • Я добавил к ошибке JDK, чтобы попытаться устранить ошибку документа. –  JodaStephen 11.03.2015 в 11:47
Показать остальные комментарии
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);

Ввод P-6H3M не соответствует этому регулярному выражению. Если он изменен на

"(T?(?:([-+]?[ ...

в четвертой строке (обратите внимание на ? после T ), примеры соответствуют (проверьте его на Ссылка ).

Итак, похоже, что вы обнаружили несогласованность между кодом и JavaDoc.

    
ответ дан user1907906 10.03.2015 в 09:27
  • Почему это ошибка? Во-первых, эталонный ОП, принятый к стандарту, относится к представлению даты + времени, а не к представлению продолжительности. Во-вторых, взаимное соглашение означает, что JDK может принять решение не быть соглашающейся стороной. –  RealSkeptic 10.03.2015 в 09:36
  • Вы совершенно правы. Интерпретация OP, сделанная из стандарта, вероятно, неверна. –  Mar 10 '15 at 8:37 10.03.2015 в 09:37
  • Regex: hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/... –  kervin 20.02.2016 в 22:39