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
.
Жаль, что он не принимает исходную строку.