-2

我正在以这种格式通过 JSON 获得时间"DocTime": "PT18H30M"

如何从这种格式转换为正常的字符串时间,例如"6:30 pm"在 android 中?

暂时我找到了这个解决方案:

    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);
4

2 回答 2

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

如果您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available

使用 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#toHoursPartDuration#toMinutesPart是随 Java-9 引入的。

于 2020-09-26T13:37:26.183 回答
2

java.time 通过脱糖或 ThreeTenABP

您似乎收到了一个字符串,其中有人误解了 ISO 8601 标准,并给了您一个字符串,表示他们打算一天中的某个时间的持续时间。

我建议您使用现代 Java 日期和时间 API java.time 来完成您的时间工作。错误字符串的问题可以通过将其视为从 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 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保您从org.threeten.bp子包中导入日期和时间类。

链接

于 2020-09-26T14:17:00.717 回答