DateTimeParseException с индексом 0 с ThreeTenABP

Я пытаюсь разобрать временную строку с помощью 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам