Преобразование времени Продолжительность во время Строка
Я получаю время через JSON в этом формате
"DocTime": "PT18H30M"
.
Как преобразовать из этого формата в обычное время строки, например
"6:30 pm"
в андроиде?
На данный момент я нашел это решение:
String json = "PT18H30M";
System.out.println("Server Time: " +json);
int h = json.indexOf("H");
int m = json.indexOf("M");
int hrs = Integer.valueOf(json.substring(2 , h));
// System.out.println("hrs: " + hrs);
int min = Integer.valueOf(json.substring((h+1) , m));
// System.out.println("min: " + min);
String shrs = (hrs>12)? String.valueOf((hrs - 12)) : String.valueOf(hrs);
String mode = (hrs>12)? "pm" : "am";
String fTime = shrs+":"+min+" "+mode;
System.out.println("Normal Time: " +fTime);
2 ответа
Сделайте это следующим образом:
С Java-8:
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
Duration duration = Duration.parse("PT18H30M");
LocalTime time = LocalTime.of((int) duration.toHours(), (int) (duration.toMinutes() % 60));
System.out.println(time.format(DateTimeFormatter.ofPattern("h:m a")));
}
}
Вывод:
6:30 pm
Если ваш уровень API Android по-прежнему не совместим с Java-8, проверьте API-интерфейсы Java 8+, доступные через десугаринг, а также Как использовать ThreeTenABP в Android Project.
С Java-9:
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
Duration duration = Duration.parse("PT18H30M");
LocalTime time = LocalTime.of(duration.toHoursPart(), duration.toMinutesPart());
System.out.println(time.format(DateTimeFormatter.ofPattern("h:m a")));
}
}
Вывод:
6:30 pm
Обратите внимание, что Duration#toHoursPart
и Duration#toMinutesPart
были введены в Java-9.
java.time либо через десугаринг, либо через ThreeTenABP
Похоже, вы получили строку, в которой кто-то неправильно понял стандарт ISO 8601, и предоставили вам строку, представляющую продолжительность, в которой они предполагали время суток.
Я рекомендую вам использовать java.time, современный API даты и времени Java, для вашего времени. Проблема с неправильной строкой может быть решена, если рассматривать ее как продолжительность с 00:00.
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
String docTimeString = "PT18H30M";
Duration docTimeDur = Duration.parse(docTimeString);
LocalTime docTimeOfDay = LocalTime.MIDNIGHT.plus(docTimeDur);
String humanReadableDocTime = docTimeOfDay.format(formatter);
System.out.println(humanReadableDocTime);
Вывод:
6:30 ВЕЧЕРА
Я использую тот факт, что
Duration.parse()
ожидает и анализирует формат ISO 8601.
"Для вызова требуется уровень API 26 (текущий мин. 16): java.time.Duration#parse", показывающий это
java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.
- В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
- В Java 6 и 7, отличных от Android, вы получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На более старых версиях Android используйте Desugaring или версию ThreeTen Backport для Android. Это называется ThreeTenABP. В последнем случае убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки
- Учебник Oracle: Date Time, объясняющий, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где
java.time
был впервые описан. - Проект ThreeTen Backport, то портировать из
java.time
на Java 6 и 7 (ThreeTen для JSR-310). - API-интерфейсы Java 8+, доступные через удаление сахара
- ThreeTenABP, версия ThreeTen Backport для Android
- Вопрос: как использовать ThreeTenABP в Android Project, с очень подробным объяснением.
- Статья в Википедии: ISO 8601