Преобразование времени Продолжительность во время Строка

Я получаю время через 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 с подпакетами.

Ссылки

Другие вопросы по тегам