我得到的时间字段值采用“10:30:00.000Z”格式。
我想将其转换为 10:30 AM/PM 格式。我正在尝试使用 SimpleDateFormat 并解析它,但我收到了 java.text.ParseException。有人可以帮我解决这个问题吗?
TreatmentObject.getTime() 的值 = "10:30:00.000Z"
'''
if (treatmentObject.getTIME1() != null) {
System.out.println("Treatment time is"+treatmentObject.getTIME1());
time1 = toISO8601UTC(fromISO8601UTC(treatmentObject.getTIME1()));
System.out.println("Time1 is" + time1);
}
public static String toISO8601UTC(Date date) {
System.out.println("date is::" + date);
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSSZZZZZ");
df.setTimeZone(tz);
System.out.println("String date is::" + df.format(date));
return df.format(date);
}
public static Date fromISO8601UTC(String dateStr) {
System.out.println("dateStr is::" + dateStr);
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("hh:mm a");
df.setTimeZone(tz);
try {
System.out.println("parse dateStr is::" + df.parse(dateStr));
return df.parse(dateStr);
} catch (ParseException e) {
System.out.println("Inside catch exception");
e.printStackTrace();
}
return null;
}
'''
java.time
String treatmentTimeString = "20:01:00.000Z";
DateTimeFormatter timeFormatter
= DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
.withLocale(Locale.US);
OffsetTime treatmentTime = OffsetTime.parse(treatmentTimeString);
OffsetTime timeInUtc = treatmentTime.withOffsetSameInstant(ZoneOffset.UTC);
String formattedTime = timeInUtc.format(timeFormatter);
System.out.println("Treatment time: " + formattedTime);
该片段的输出是:
治疗时间:晚上 8:01
我正在使用 java.time,现代 Java 日期和时间 API。我进一步利用这样一个事实:您的时间字符串符合 ISO 8601,这是 java.time 类默认解析(以及打印)的标准格式,即没有任何显式格式化程序。对于格式化,我使用 Java 的内置本地化格式。通过这种方式,我不必自己编写任何格式模式字符串,否则这总是一个容易出错的任务。
我正在将解析的时间转换为 UTC。在示例中这不是必需的,因为Z
示例字符串中的内容表明它已经是 UTC。不管怎样,这样做可以确保如果有一天您得到具有不同偏移量的时间字符串,您也将获得正确的 UTC 时间。
问:我可以在 Android API 级别 21 上使用 java.time 吗?
它给出了预期的输出,但问题是,它适用于
最低 API 级别 26。我的最低 API 级别 21。那么有什么解决方法吗?
是的,当然,java.time 在旧版和新版 Android 设备上都能很好地工作。只需要至少Java 6.
- 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中,获取 ThreeTen Backport,即现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保您从以下位置导入日期和时间类
org.threeten.bp
与子包。
你的代码出了什么问题?
看来您交换了现有的格式和您想要的格式。你有过20:01:00.000Z
并尝试使用具有格式模式的格式化程序来解析它hh:mm a
。除了您报告的异常之外,这显然失败了。之后您尝试格式化Date
您期望使用具有格式模式的格式化程序进行解析HH:mm:ss.SSSZZZZZ
。如果你已经走到这一步,你会发现它给了你20:01:00.000+0000
,所以不是 10:30 AM/PM 格式。
Links
-
Oracle 教程:日期时间 https://docs.oracle.com/javase/tutorial/datetime/解释如何使用 java.time。
-
Java 规范请求 (JSR) 310 https://jcp.org/en/jsr/detail?id=310, where
java.time
首次被描述。
-
ThreeTen 后移植项目 http://www.threeten.org/threetenbp/,向后移植
java.time
到 Java 6 和 7(JSR-310 为 ThreeTen)。
-
三十ABP https://github.com/JakeWharton/ThreeTenABP, Android 版 ThreeTen Backport
-
问题:如何在Android项目中使用ThreeTenABP https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project,有非常详尽的解释。
- 维基百科文章:ISO 8601 https://en.wikipedia.org/wiki/ISO_8601
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)