微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从时间持续时间到时间字符串的转换

我正在通过"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 desugaringHow to use ThreeTenABP in 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#toHoursPartDuration#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。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。

链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。