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的版本兼容性问题:
- 首先在
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' }
- 然后用
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 ツ
相关产品推荐
相关产品推荐

