java .time и ThreeTenABP
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
String instantString = "2020-02-05T03:17:04.000Z";
Instant i = Instant.parse(instantString);
ZonedDateTime dateTime = i.atZone(ZoneId.systemDefault());
String fechaConvert = dateTime.format(timeFormatter);
System.out.println("Converted time: " + fechaConvert);
Я запустил этот фрагмент с моим часовым поясом JVM, установленным в Америку / Гуаякиль (время в Эквадоре), и получил:
Преобразовано время: 22: 17
(Многие другие часовые пояса используются в разных частях Южной Америки.)
Ваша строка на мгновение в формате ISO 8601 (точка в время). Instant.parse()
ожидает этот формат, поэтому нам не нужен явный форматер для синтаксического анализа.
Классы даты и времени, которые вы пытались использовать, SimpleDateFormat
и Date
, плохо разработаны и давно устарели, бывший особенно печально известен. Вместо этого я использую java .time, современный Java API даты и времени. Честно говоря, мне гораздо приятнее работать с ним.
Что пошло не так в вашем коде?
Одна из многих запутанных черт SimpleDatFormat
заключается в том, что он рад разбирать только столько данной строки, как он может и молчаливо игнорировать остальное. Z
в вашей строке говорит нам, что дата и время указаны в UT C, но ваш SimpleDateFormat
игнорирует этот важный факт. Поэтому он анализирует дату и время, как если бы они были в вашем часовом поясе. Затем второй экземпляр SimpleDateFormat
форматирует неверное время и возвращает время, которое было в строке, 03:17
(в этом примере).
Как сказал Андреас, с уровня API 24 SimpleDateFormat
можно правильно разобрать Z
. На более низких уровнях API это невозможно. В отличие от этого java .time был портирован и работает на более низких уровнях API.
Вопрос: java .time не требует Android API уровня 26?
java .time прекрасно работает как на старых, так и на новых Android устройствах. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых Android устройствах (от уровня API 26) современный встроенный API -in.
- В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
- Вкл. (Старше) Android Используйте редакцию ThreeTen Backport Android. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки