Это немного сложно.
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()
не работает, извините.