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

SimpleDateFormat解析日期仅真机报错问题排查与解决

问题原因及修复方案

问题原因

核心问题是**SimpleDateFormat未指定英文Locale**。Android 9真机如果系统语言为中文或其他非英文语言,默认Locale会使用对应语言的规则,此时用它解析英文的星期缩写(Mon)、月份缩写(Jul)时,会因格式不匹配抛出Unparseable date异常。而模拟器通常默认使用英文Locale,所以能正常解析。

修复方法

方法1:给SimpleDateFormat指定英文Locale

修改原代码,创建SimpleDateFormat实例时明确传入Locale.ENGLISH,强制用英文规则解析和格式化日期:

ref.child(currentData.id.toString()).child("onwork_start").get().addOnSuccessListener {
    val sdf = SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy", Locale.ENGLISH)
    val time = sdf.parse(it.value.toString())
    val date = SimpleDateFormat("dd MMM HH:mm", Locale.ENGLISH)
    val show_time = date.format(time)
    holder.tv_konfirmasi_bill.text = show_time.toString()
}

方法2:使用java.time新日期API(推荐,SDK28及以上支持)

Android 9(SDK28)已内置Java 8的java.time包,替代老旧的SimpleDateFormat,它线程安全、API设计更清晰,不易出现Locale或时区问题:

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

ref.child(currentData.id.toString()).child("onwork_start").get().addOnSuccessListener {
    val inputFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss yyyy", Locale.ENGLISH)
    val localDateTime = LocalDateTime.parse(it.value.toString(), inputFormatter)
    val outputFormatter = DateTimeFormatter.ofPattern("dd MMM HH:mm", Locale.ENGLISH)
    val show_time = localDateTime.format(outputFormatter)
    holder.tv_konfirmasi_bill.text = show_time
}

补充说明

  • 你之前尝试移除时区信息无效,是因为问题根源并非时区,而是Locale不匹配导致英文日期组件无法被解析。
  • 两种方法都能解决问题,优先推荐方法2,java.time是官方推荐的新一代日期处理API,避免了SimpleDateFormat的诸多缺陷。

内容的提问来源于stack exchange,提问作者MadsterMIZE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:48:21