java.time
String treatmentTimeString = "20:01:00.000Z";
DateTimeFormatter timeFormatter
= DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
.withLocale(Locale.US);
OffsetTime treatmentTime = OffsetTime.parse(treatmentTimeString);
OffsetTime timeInUtc = treatmentTime.withOffsetSameInstant(ZoneOffset.UTC);
String formattedTime = timeInUtc.format(timeFormatter);
System.out.println("Treatment time: " + formattedTime);
Выходные данные из этого фрагмента:
Время обработки: 20:01
Я использую Java.time, современный Java API даты и времени.Далее я использую тот факт, что ваша временная строка соответствует ISO 8601, стандартному формату, который классы java.time анализируют (и также печатают) по умолчанию, то есть без какого-либо явного средства форматирования.Для форматирования я использую встроенный в Java локализованный формат.Таким образом, я свободен от написания любой строки шаблона формата, что в противном случае всегда является ошибкой.
Я конвертирую проанализированное время в UTC.В примере это не является необходимым, поскольку Z
в строке примера указывает, что оно уже в UTC.Независимо от этого, вы также получите правильное время UTC, если однажды вы получите строку времени с другим смещением.
Вопрос: Могу ли я использовать java.time на уровне API Android 21 уровня?
Это дает ожидаемый результат, но проблема в том, что он работает с минимальным API-уровнем 26. Мой минимальный API-уровень 21. Итак, какой обходной путь?
Да, конечно, Java.время работает хорошо на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный встроенный API.
- В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Что пошло не так в вашем коде?
Кажется, вы поменяли формат, который вы имели, и форматВы хотели.Вы получили 20:01:00.000Z
и попытались проанализировать его с помощью средства форматирования с шаблоном формата hh:mm a
.Это явно не удалось, за исключением того, что вы сообщили.После этого вы попытались отформатировать Date
, который вы ожидали получить при разборе, с помощью средства форматирования с шаблоном форматирования HH:mm:ss.SSSZZZZZ
.Если бы вы зашли так далеко, вы бы увидели, что он дал вам 20:01:00.000+0000
, а не формат 10:30 AM / PM.
Ссылки