我得到的时间字段值采用“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);
此代码段的输出是:
Treatment time: 8:01 PM
我正在使用 java.time,现代 Java 日期和时间 API。我进一步利用这样一个事实:您的时间字符串符合 ISO 8601,这是 java.time 类默认解析(以及打印)的标准格式,即没有任何显式格式化程序。对于格式化,我使用 Java 的内置本地化格式。这样我就不用自己编写任何格式模式字符串,否则这总是一个容易出错的任务。
我正在将解析的时间转换为 UTC。在示例中,这不是必需的,因为示例字符串中的 Z
表明它已经采用 UTC。不管怎样,这样做可以确保如果有一天您得到具有不同偏移量的时间字符串,您也将获得正确的 UTC 时间。
问题:我可以在 Android API 级别 21 上使用 java.time 吗?
It is giving the expected output but the problem is, it works with minimum API Level 26. My minimum api level 21. So any workaround?
是的,当然,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
的格式化程序来解析它。除了您报告的异常之外,这显然失败了。之后,您尝试使用具有格式模式 HH:mm:ss.SSSZZZZZ
的格式化程序来格式化您期望通过解析获得的 Date
。如果您已经看到这里,您会发现它为您提供了 20:01:00.000+0000
,因此不是 10:30 AM/PM 格式。
链接
- Oracle tutorial: Date Time解释如何使用 java.time。
- Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
向 Java 6 和 7 的向后移植(对于 JSR-310,为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
- Wikipedia article: ISO 8601
关于java.text.ParseException : Unparseable date: "20:01:00.000Z",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302402/