DateTimeParseException в индексе 0 с ThreeTenABP - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь проанализировать строку времени с ThreeTenABP (потому что я должен поддерживать min SDK 19). Я думаю, что строка ISO 8601:

20200117T172638.000Z

Я получаю следующее исключение:

org.threeten.bp.format.DateTimeParseException: Text '20200117T172638.000Z' could not be parsed at index 0

Мой код:

Instant instant = Instant.parse("20200117T172638.000Z");
long time = instant.getEpochSecond();

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Это немного сложно.

    DateTimeFormatter instantFormatter = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmss.SSSX");
    String s = "20200117T172638.000Z";
    Instant instant = instantFormatter.parse(s, Instant.FROM);
    System.out.println(instant);

Вывод этого фрагмента

2020-01-17T17: 26: 38Z

Получение секунд с начала эпохи, если Instant работает так, как в вашем вопросе, поэтому я не буду повторять его.

Используйте форматтер, который описывает точный формат входной строки. Поскольку не существует метода Instant.parse, который бы принимал DateTimeFormatter в качестве второго аргумента, нам нужно выполнить анализ наоборот, используя метод (generi c) DateTimeFormatter.parse(CharSequence, TemporalQuery<T>). И нам нужно передать запрос Instant.FROM этому методу, потому что бэкпорт разработан для Java версий, которые не имеют ссылок на метод. (Используя собственный java .time из Java 8 и более поздних версий, вместо этого мы будем использовать ссылку на метод Instant::from).

Я знаю, что ваша строка имеет формат ISO 8601. И я знаю, что сказано, что классы java .time анализируют формат ISO 8601 без какого-либо явного средства форматирования (я сам уже писал это много раз о переполнении стека). Это не совсем так: классы java .time parse наиболее распространенные варианты формата ISO 8601 без какого-либо явного форматера. ISO 8601 имеет довольно много свобод синтаксиса, некоторые из которых разрешены всегда, а некоторые могут быть необязательно согласованы между сторонами, обменивающимися форматом ISO 8601. Вы столкнулись с вариантом, с которым Instant.parse() не работает, извините.

0 голосов
/ 17 января 2020

Похоже, мне просто нужно добавить - и : к строке как 2020-01-17T17:26:38.000Z.

Жаль, что он не принимает исходную строку.

...