Android中SimpleDateFormat解析时间字符串频繁抛出ParseException问题
排查SimpleDateFormat解析"06:00:00 PM"抛出ParseException的问题
问题根源
本地测试正常但线上频繁崩溃,核心原因是Locale不匹配:
- 你本地设备处于英文环境,
Locale.getDefault()会生成适配英文时间格式的解析器,能正常识别"PM"标识; - 线上用户设备的Locale可能是中文、欧洲语言等非英文环境,此时用默认Locale创建的
SimpleDateFormat无法解析英文的"AM/PM"标记,直接抛出ParseException。
修复方案
服务器返回的是英文格式的时间字符串,必须强制使用英文Locale来创建解析器,把Locale.getDefault()替换为Locale.US或Locale.ENGLISH即可:
public static String toTimeString(String time, String inTimeFormat, String outTimeFormat) { // 强制使用英文Locale解析/格式化英文时间字符串 DateFormat df1 = new SimpleDateFormat(inTimeFormat, Locale.US); DateFormat df2 = new SimpleDateFormat(outTimeFormat, Locale.US); String timeString = ""; try { Date date = df1.parse(time); timeString = df2.format(date); // 原代码中_12HrTime为未定义变量,此处修正为timeString } catch (ParseException e) { Crashlytics.recordException(e); } return timeString; }
额外注意
- 原代码存在未定义变量
_12HrTime,已修正为方法内的timeString,避免编译错误; - 如果后续服务器可能返回其他语言的时间格式,需和服务端约定固定Locale,或在响应中携带Locale信息动态适配,但当前场景下固定英文Locale是最直接的解决方案。
内容的提问来源于stack exchange,提问作者AndroidDev
相关产品推荐
相关产品推荐

