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
相关产品推荐
相关产品推荐

