如何解决从时间持续时间到时间字符串的转换
我正在通过"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和How 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#toHoursPart
和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。
- 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
- 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类。
链接
- Oracle tutorial: Date Time解释如何使用java.time。
- Java Specification Request (JSR) 310,其中首先描述了
java.time
。 - ThreeTen Backport project,即
java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。 - Java 8+ APIs available through desugaring
- ThreeTenABP,Android版本的ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project,其中有非常详尽的解释。
- Wikipedia article: ISO 8601
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。