Java/Kotlin使用cs_CZ Locale时日期格式不符,如何获取dd. MM.格式?
问题原因
Locale("cs", "CZ")对应的Unicode CLDR(通用区域数据仓库)默认规则中,ddMM对应的最佳日期格式就是dd.MM.,没有中间空格,所以系统原生方法返回的结果符合区域默认规范,如果你需要自定义格式,可采用以下方案:
可行解决方案
最稳妥的实现方式是针对cs_CZ区域做特殊判断,其他区域仍然保留系统默认规则,不会影响其他国家/地区的适配逻辑。
Kotlin 实现
val pattern = if (locale.language == "cs" && locale.country == "CZ") { // 捷克区域自定义带空格的格式 "dd. MM." } else { DateFormat.getBestDateTimePattern(locale, "ddMM") } // 原代码中ofPattern已指定locale,后续withLocale属于冗余调用可直接省略 val dateFormatted = DateTimeFormatter.ofPattern(pattern, locale).format(date)
Java 实现
String pattern; if ("cs".equals(locale.getLanguage()) && "CZ".equals(locale.getCountry())) { pattern = "dd. MM."; } else { pattern = DateFormat.getBestDateTimePattern(locale, "ddMM"); } String dateFormatted = DateTimeFormatter.ofPattern(pattern, locale).format(date);
优化建议
如果后续需要适配的自定义区域格式较多,可以将不同区域的自定义格式存放到配置文件/常量类中统一管理,避免硬编码散落在业务逻辑中,后续修改维护更方便。
内容的提问来源于stack exchange,提问作者StuartDTO
相关产品推荐
相关产品推荐

