特定小米Redmi Note 10 Pro设备SimpleDateFormat解析异常求助
问题分析与解决方案
核心问题原因
- Locale不匹配:代码使用
Locale.getDefault()解析英文格式的日期字符串("Sep"是英文月份缩写),但小米Redmi Note 10 Pro的系统默认Locale可能为中文(如zh_CN),该设备Android 13系统的中文Locale解析器无法识别英文月份缩写,触发ParseException。 - 无效时间格式:"24:00:00"不符合
HH:mm:ss的格式规范(HH合法范围是00-23),无论何种Locale都会解析失败。
解决方案
1. 强制指定英文Locale解析日期
由于日期字符串是英文格式,必须明确使用英文Locale(如Locale.ENGLISH)解析,避免系统默认Locale的不确定性。
2. 处理24:00的特殊情况
将"24:00:00"替换为"00:00:00",解析完成后将日期加1天,以此正确表示当日结束、次日开始的时间点。
推荐代码实现(Android API 26+支持)
import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.Locale fun parseDate(dateString: String): LocalDateTime? { // 处理24:00的特殊格式 val adjustedDate = if (dateString.endsWith("24:00:00")) { dateString.replace("24:00:00", "00:00:00") } else { dateString } // 指定英文Locale和对应格式 val formatter = DateTimeFormatter.ofPattern("MMM d yyyy HH:mm:ss", Locale.ENGLISH) return try { var parsedDateTime = LocalDateTime.parse(adjustedDate, formatter) // 若原字符串是24:00,日期加一天 if (dateString.endsWith("24:00:00")) { parsedDateTime = parsedDateTime.plusDays(1) } parsedDateTime } catch (e: Exception) { e.printStackTrace() null } }
兼容低版本Android(API <26)
若需兼容Android 7.0及以下版本,引入ThreeTenABP库(Android版JSR-310日期API),代码逻辑一致,仅替换导入路径:
import org.threeten.bp.LocalDateTime import org.threeten.bp.format.DateTimeFormatter import java.util.Locale // 其余代码逻辑同上
关键注意事项
- 避免使用
SimpleDateFormat:该类线程不安全,且不同厂商系统的解析逻辑存在差异,推荐用DateTimeFormatter或ThreeTenABP替代。 - 固定Locale:解析非本地语言的日期字符串时,必须明确指定对应Locale,不要依赖系统默认值。
内容的提问来源于stack exchange,提问作者oTwo
相关产品推荐
相关产品推荐

