Java Android中字符串转Date解析失败如何解决
报错核心原因
- 旧的
java.util.Date转换逻辑触发Unparseable date报错,核心有两处问题:- Locale配置完全不匹配:待解析字符串中的星期、月份是英文缩写(
Fri、Apr),但代码中指定了Locale.GERMANY,解析器会按照德语规则匹配字段——德语的星期缩写为2字符长度(如周五缩写为Fr),根本无法识别3字符长度的英文星期缩写Fri,直接中断解析流程。 - 时区字段格式匹配偏差:格式串中的
zzz是用于匹配通用时区缩写的占位符,而原字符串里的GMT+02:00是带数值偏移的时区标识,不属于常规时区缩写范畴,即使Locale配置正确,这部分字段也容易出现匹配错误。
- Locale配置完全不匹配:待解析字符串中的星期、月份是英文缩写(
- 你当前切换为
OffsetDateTime的实现是更合理的选型,相比旧SimpleDateFormat线程不安全、格式匹配容错差的问题,java.time包的API具备线程安全、格式校验严谨的优势。
OffsetDateTime方案的落地注意事项
- 你当前编写的解析格式
yyyy-MM-dd'T'HH:mm:ss.SSSXXX本身可以正确匹配2021-04-30T02:14:49.067+02:00这类标准ISO格式字符串,不存在逻辑错误。 - 如果你的Android应用minSdk版本低于26,需要提前在项目中配置coreLibraryDesugaring,才能正常调用java.time包的所有类,否则会出现类找不到的运行时错误。
- 针对标准ISO 8601偏移时间格式,无需手动编写格式串,直接使用内置的
DateTimeFormatter.ISO_OFFSET_DATE_TIME即可完成解析,可避免自定义格式时遗漏毫秒、偏移量位数等细节问题,示例代码:
String datestr = cursor.getString(cursor.getColumnIndex(UPDATED_AT)); OffsetDateTime myDate = OffsetDateTime.parse(datestr, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
- 如果还需要兼容解析旧的
Fri Apr 30 00:12:13 GMT+02:00 2021格式的历史数据,不要继续使用配置错误的SimpleDateFormat,可以用java.time包的ZonedDateTime搭配英文Locale完成解析,示例代码:
DateTimeFormatter legacyFormat = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); ZonedDateTime legacyDate = ZonedDateTime.parse(datestr, legacyFormat);
内容的提问来源于stack exchange,提问作者Lelouch VX
相关产品推荐
相关产品推荐

