You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 6.0解析特定格式日期字符串失败,高版本正常求解决

解决Android 6.0下SimpleDateFormat解析日期失败的问题

这个问题的核心原因是Android 6.0(API 23)及以下版本的SimpleDateFormat对格式匹配的容错性远低于高版本:你的日期字符串末尾带有(GMT +05:30)时区信息,但你的格式串里完全没有对应这部分内容。高版本Android会自动忽略不匹配的尾部内容,但低版本会严格校验格式一致性,所以抛出了"Unparseable date"异常。

下面给你两种可靠的解决思路:

方法一:移除字符串中的时区部分(推荐)

直接把日期字符串末尾的时区信息去掉,让它和你的格式串完全匹配,这是最稳妥的方式。可以用正则表达式来处理,适配不同的GMT偏移值:

SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM dd yyyy; hh:mm:ss a",Locale.ENGLISH);
for(int i=0 ; i <jArr.length() ; i++){
    // 移除末尾的GMT时区部分(适配任意偏移值)
    String tempDate = jArr.get(i).toString().replaceAll("\\s*\\(GMT.*\\)$", "");
    dateList.add(tempDate);
}
try{
    Date d1 = sdf3.parse(dateList.get(0));
} catch (Exception e) {
    e.printStackTrace();
}

\\s*\\(GMT.*\\)$这个正则会匹配字符串末尾所有以(GMT开头的括号内容,包括前面的空格,确保处理后的字符串完全符合你的格式串要求。

方法二:修改格式串包含时区信息

如果你需要保留时区信息,可以调整格式串来匹配完整的日期字符串,但要注意旧版本SimpleDateFormat对时区格式的支持:

// 格式串末尾添加时区部分的匹配规则
SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM dd yyyy; hh:mm:ss a (GMT ZZ)", Locale.ENGLISH);
try{
    // 直接解析原始字符串,不需要预处理
    Date d1 = sdf3.parse(jArr.get(0).toString());
} catch (Exception e) {
    e.printStackTrace();
}

这里的ZZ会匹配+05:30这种偏移格式,但要注意部分旧设备可能对括号内的时区格式解析仍有问题,所以更推荐方法一。

进阶建议:使用Java 8+的时间API(更稳定)

如果你的项目支持,可以通过Desugar工具引入Java 8的时间API(java.time包),它的解析行为在不同Android版本中更一致,避免SimpleDateFormat的版本兼容性问题:

  1. 首先在build.gradle中开启Desugar支持:
android {
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
  1. 然后用DateTimeFormatter解析日期:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;

// 定义匹配完整日期字符串的格式器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, MMM dd yyyy; hh:mm:ss a (GMT ZZ)", Locale.ENGLISH);
// 解析字符串
LocalDateTime dateTime = LocalDateTime.parse(jArr.get(0).toString(), formatter);
// 转换为Date对象(如果需要)
Date d1 = Date.from(dateTime.atZone(ZoneId.of("GMT+05:30")).toInstant());

内容的提问来源于stack exchange,提问作者Vishal Patoliya ツ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:52:48