Java 从持续时间到时间字符串的转换

Java 从持续时间到时间字符串的转换,java,android,json,java-time,datetimeformatter,Java,Android,Json,Java Time,Datetimeformatter,我通过JSON以这种格式获取时间“DocTime”:“PT18H30M” 如何将此格式转换为正常字符串时间,例如android中的“6:30 pm” 目前,我找到了这个解决方案: String json = "PT18H30M"; System.out.println("Server Time: " +json); int h = json.indexOf("H"); int m = json.inde

我通过JSON以这种格式获取时间
“DocTime”:“PT18H30M”

如何将此格式转换为正常字符串时间,例如android中的“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);
按如下方式操作:

使用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
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
输出:

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
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
如果您的Android API级别仍然不符合Java-8,请检查并重试

使用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((int) duration.toHours(), (int) (duration.toMinutes() % 60));
        System.out.println(time.format(DateTimeFormatter.ofPattern("h:m a")));
    }
}
6:30 pm
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
输出:

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
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
请注意,和是通过Java-9引入的。

Java.time通过desugaring或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

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

“调用需要API级别26(当前最小值为16):java.time.Duration#parse”显示 time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

您的字符串PT18H30M表示这是一个持续时间,一个时间量。你确定是指下午6:30吗?如果是这样,教育字符串的发布者省略句点的
P
,并使用
18:30
T18:30
。调用需要API级别26(当前最小值为16):java.time.Durationthis@JoydeepSaha这就是您需要通过答案中给出的desugaring链接到Java8+API的地方(另一种选择是)。“调用需要API级别26(当前最小值为16):java.time.Duration#parse”显示this@JoydeepSaha我已经在回答中提到了这一点。请也阅读这一部分。