Я получил это от https://stackoverflow.com/a/18217193/6727914
val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
val string1 = "2022-12-29T19:59:20.783357Z"
val result1: Date = df1.parse(string1)
Но это не работает:
Исключение в потоке "основной" java.text.ParseException: неразборчивая дата: «2022-12-29T19:59:20.783357Z» в java.text.DateFormat.parse (:-1)
в FileKt.main (File.kt:13) в FileKt.main (File.kt:-1)
Я не могу использовать Instant.parse(date)
Дата «2022-12-29T19:59:20.783357Z» является допустимой строкой Iso8601, где 783 — миллисекунды, а 357 — микросекунды.
Вы рассматривали вариант просмотра api.flutter.dev/flutter/dart-core/DateTime/parse.html? Непонятно, почему это помечено как Java/Kotlin, если вы используете ссылки Dart :shrug:
@DaveNewton Заголовок вопроса заключается в том, как анализировать дату ISO в kotlin, поэтому ожидается, что дата будет проанализирована. Указанная дата является действительной датой ISO, не уверен, что непонятно
Самая большая неясность заключается в том, почему микросекунды включены в вашу строку, но полностью отсутствуют в строке формата (я не знаю, обрабатывает ли SDF микросекунды, но строка формата игнорирует их, отсюда и ошибка).
Я не могу использовать Instant.parse(date) Почему бы и нет? SimpleDateFormat не обеспечивает точность в микросекундах.
Из-за требования API 26 моему приложению 21 год. Невозможно обновить его из-за различных ограничений.
Таким образом, вам либо не нужно добавлять микросекунды (вам действительно нужна микросекундная «точность»?), либо вам нужно обрабатывать это вручную.
@DaveNewton Мне не нужны микросекунды, но данные поступают из другого приложения, которое генерирует их с помощью встроенной функции языка, которая по умолчанию включает микросекунды, нет возможности исключить это
Тогда вам нужно будет справиться с этим вручную - выдернуть что-нибудь между SSS и последним символом и нормально разобрать, при желании снова заполнив микро?
Можно ли использовать обессахаривание ? Это сделает (большую часть) java.time доступной для вас также при разработке для API 21. См. этот ответ Arpit Bhoi.




SimpleDateFormat не может обрабатывать доли секунды с разрешением до микросекунд, его предел - разрешение до миллисекунд. Если вы попытаетесь разобрать его как есть, вы получите неверный результат, как описано в этом ответе.
У вас есть два варианта:
Instant.Примечание. В шаблоне нужно использовать X вместо Z.
Демо:
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) throws ParseException {
var df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
var string1 = "2022-12-29T19:59:20.783357Z";
string1 = string1.replaceAll("(\\.\\d{3})\\d+", "$1");
var result1 = df1.parse(string1);
System.out.println(result1);
}
}
Вывод в моем часовом поясе, Европа/Лондон:
Thu Dec 29 19:59:20 GMT 2022
import java.time.Instant;
import java.util.Date;
public class Main {
public static void main(String[] args) {
var instant = Instant.parse("2022-12-29T19:59:20.783357Z");
System.out.println(instant);
// For any reason, if you need java.util.Date
var date = Date.from(instant);
System.out.println(date);
}
}
Рекомендуемое решение java.time доступно для уровня API 21 посредством дешугаринга.
Он не соответствует предоставленному вами формату; непонятно чего вы ожидаете.
Sдля миллисекунд, их 1000 в секунду, и783357 > 1000.