
android 使用 simpledateformat 解析如 "wed jul 12 2023 23:58:20 gmt+0000 (coordinated universal time)" 这类英文日期时,若设备系统语言非英语(如阿拉伯语),因 locale.getdefault() 匹配不到对应英文缩写(如 "wed"、"jul"),将抛出 unparseable date 异常;强制指定 locale.english 即可解决。
android 使用 simpledateformat 解析如 "wed jul 12 2023 23:58:20 gmt+0000 (coordinated universal time)" 这类英文日期时,若设备系统语言非英语(如阿拉伯语),因 locale.getdefault() 匹配不到对应英文缩写(如 "wed"、"jul"),将抛出 unparseable date 异常;强制指定 locale.english 即可解决。
在 Android 开发中,SimpleDateFormat 对日期字符串的解析高度依赖 Locale 设置。当你尝试解析形如 "Wed Jul 12 2023 23:58:20 GMT+0000 (Coordinated Universal Time)" 的标准英文格式日期时,看似格式匹配("EEE MMM dd yyyy HH:mm:ss "),但实际运行时却报 Unparseable date 异常——根本原因在于:Locale.getDefault() 返回的是当前系统语言环境(例如 ar_SA 或 zh_CN),而该环境下 SimpleDateFormat 期望的星期和月份缩写是本地化版本(如阿拉伯语的 "الأربعاء" 或中文的 "周三"),无法识别英文的 "Wed" 和 "Jul"。
✅ 正确做法是显式指定 Locale.ENGLISH,确保解析器始终按英文语义理解日期字段:
val input = "Wed Jul 12 2023 23:58:20 GMT+0000 (Coordinated Universal Time)"
val sdf = SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss ", Locale.ENGLISH)
val time = try {
val mDate = sdf.parse(input)
mDate?.time ?: -1L
} catch (e: ParseException) {
-1L
}⚠️ 注意事项:
- 仅靠修改 pattern 无法解决此问题(例如添加
"GMTZ"或括号内容),因为SimpleDateFormat默认不支持解析(Coordinated Universal Time)这类冗余描述;建议先预处理字符串,移除括号及其中内容; - 更健壮的替代方案是使用现代 API:
java.time(需 API 26+)或ThreeTenABP库(兼容低版本):// 推荐(API 26+) val formatter = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss 'GMT'XX", Locale.ENGLISH) val instant = ZonedDateTime.parse(input.replace(Regex("\s*\([^)]+\)"), ""), formatter).toInstant() - 若必须支持旧 API 且需完整解析含时区信息的字符串,建议用正则提取核心时间部分再解析,例如:
val corePart = input.replace(Regex("\s*GMT[+-]\d{4}\s*\([^)]+\)"), "") // → "Wed Jul 12 2023 23:58:20"
总结:Locale 是 SimpleDateFormat 解析成败的关键隐性因素。切勿依赖 Locale.getDefault() 处理固定英文格式的输入;统一使用 Locale.ENGLISH 是简单、可靠、零成本的最佳实践。


















