Android 12/13中dd-MMM-yyyy日期格式显示异常求助
解决Android日期格式化中
dd-MMM-yyyy在12/13版本显示Sept而非Sep的问题 问题原因
Android 12和13系统里,默认Locale的月份缩写规则有变化,导致SimpleDateFormat输出Sept,而旧版本系统输出的是更短的Sep,这就造成了版本间的不一致。
解决方案
方案1:指定固定Locale(兼容所有Android版本)
直接给SimpleDateFormat指定美式英语Locale,美式英语里九月的缩写固定是Sep,能保证所有版本输出统一:
@JvmStatic fun getCurrentDate(format: String): String { // 指定Locale.US确保月份缩写规则一致 val sdf = SimpleDateFormat(format, Locale.US) val currentDate = sdf.format(Date()) return currentDate }
方案2:使用Java 8+日期API(推荐,更稳定)
SimpleDateFormat是过时的API,推荐用java.time包下的类(Android API 26+原生支持,低版本可通过开启Core Library Desugaring兼容):
@JvmStatic fun getCurrentDate(format: String): String { val formatter = DateTimeFormatter.ofPattern(format, Locale.US) val currentDate = LocalDate.now().format(formatter) return currentDate }
如果要兼容API 26以下版本,需要在Module级别的build.gradle中开启Desugaring:
android { defaultConfig { // 开启Core Library Desugaring coreLibraryDesugaringEnabled = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' }
说明
- 核心是指定
Locale.US,不同Locale的月份缩写规则差异大,固定Locale能避开系统版本或用户区域设置带来的影响。 - Java 8日期API比
SimpleDateFormat更线程安全、设计更合理,是长期维护的首选方案。
内容的提问来源于stack exchange,提问作者Anil Ranga
相关产品推荐
相关产品推荐

