java.text.ParseException : Unparseable date: "20:01:00.000Z"

标签 java time simpledateformat time-format parseexception

我得到的时间字段值采用“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 格式。

链接

关于java.text.ParseException : Unparseable date: "20:01:00.000Z",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302402/

相关文章:

java - 使用 java.util.Calendar 添加天数会产生奇怪的结果

java - 动态更新 Jlist

python - 如何在pandas python中逐步连续计算相同行之间的时间差

r - 是否有 R 函数来解析包含不同格式日期的向量?

ruby - 一年中的周数,有点

scala - 无法在 java/scala 中使用 SimpleDateFormat 解析日期

java - 在 SimpleDateFormat 模式字符串中使用字母字符

Java多个Class和多个main方法,执行所有main方法

java - 什么是 NullPointerException,我该如何解决?

java - JPA 标准 : Convert int to String then select from substring of resulting String