从时间 Duration 到时间 String 的转换

Conversion from time Duration to time String

我正在以这种格式 "DocTime": "PT18H30M".

通过 JSON 获取时间

如何从这种格式转换为正常的字符串时间,例如"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);

按如下操作:

与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,请检查 Java 8+ APIs available through desugaring and

与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 and Duration#toMinutesPart 是在 Java-9 中引入的。

java.time 通过脱糖或通过 ThreeTenABP

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

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的时间工作。字符串不正确的问题可以通过将其视为自 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 PM

我正在利用 Duration.parse() 期望并解析 ISO 8601 格式这一事实。

“通话需要 API 级别 26(当前最低级别为 16):java.time.Duration#parse”显示此

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)现代 API 出现 built-in.
  • 在 non-Android Java 6 和 7 中获取 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接