java.text.ParseException:无法解析的日期:“20:01:00.000Z”

2024-02-09

我得到的时间字段值采用“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(使用前将#替换为@)

java.text.ParseException:无法解析的日期:“20:01:00.000Z” 的相关文章

随机推荐