You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

特定小米Redmi Note 10 Pro设备SimpleDateFormat解析异常求助

问题分析与解决方案

核心问题原因

  1. Locale不匹配:代码使用Locale.getDefault()解析英文格式的日期字符串("Sep"是英文月份缩写),但小米Redmi Note 10 Pro的系统默认Locale可能为中文(如zh_CN),该设备Android 13系统的中文Locale解析器无法识别英文月份缩写,触发ParseException。
  2. 无效时间格式:"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:42:20