无法解析的日期:Android 6.0 中的 "Thursday, Jan 09 2020; 04:31:59 PM (GMT +05:30)"(在偏移量 39 处)

Unparseable date: "Thursday, Jan 09 2020; 04:31:59 PM (GMT +05:30)" (at offset 39) in Android 6.0

我正在尝试解析带有日期的字符串,以将其转换为日期格式。字符串采用以下格式。

2020 年 1 月 9 日,星期四; 04:31:59 下午(格林威治标准时间 +05:30)

SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM dd yyyy; hh:mm:ss a",Locale.ENGLISH);

for(int i=0 ; i <jArr.length() ; i++){
    String tempDate = jArr.get(i).toString();
    dateList.add(tempDate);
}

try{
    Date d1 = sdf3.parse(dateList.get(0));                        
} catch (Exception e) {
    e.printStackTrace(); 
}

注意:此功能在 android 版本 > 6 时工作正常。

在 SimpleDateFormat 的参数中试试这个 EPOCH_FORMAT :

String formatter = "EE MMM dd HH:mm:ss z yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(formatter,Locale.US);

要获得所需的格式,您必须使用 SimpleDateFormat,如下所示:

String dateString = "Thursday, Jan 09 2020; 04:31:59 PM (GMT +05:30)";
SimpleDateFormat sourceFormat = new SimpleDateFormat("EEE, MMM dd yyyy; hh:mm:ss a",Locale.ENGLISH);

try{
    Date d1 = sourceFormat.parse(dateString);                        
} catch (Exception e) {
    e.printStackTrace(); 
}

SimpleDateFormat targetFormat = new SimpleDateFormat("dd/MM/yy; hh:mm:ss a", Locale.ENGLISH)

String desiredString = targetFormat.format(d1);
//desiredString is now "09/01/20; 04:31:59 PM"

java.time 和 ThreeTenABP

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "EEEE, MMM dd uuuu; hh:mm:ss a '(GMT' xxx')'", Locale.ENGLISH);

    String tempDate = "Thursday, Jan 09 2020; 04:31:59 PM (GMT +05:30)";
    OffsetDateTime odt = OffsetDateTime.parse(tempDate, formatter);
    System.out.println(odt);

此片段的输出是:

2020-01-09T16:31:59+05:30

为了获得正确的时间,您需要解析字符串中的 GMT 偏移量。

我正在使用 java.time,现代 Java 日期和时间 API 因为 SimpleDateFormatDate 设计不佳且早已过时,前者特别是出了名的麻烦。而且因为 java.time 更好用。

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接