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

时间:2019-05-25 06:38:33

标签: 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;
}

'''

1 个答案:

答案 0 :(得分:1)

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反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做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格式。

链接