Android中如何可靠获取HijrahDate(回历)的月份名称?
Android上可靠获取回历(Hijrah)月份名称的方法
你遇到的问题本质是Android系统自带的java.time本地化资源不全,对伊斯兰历(Hijrah)的月份名称支持存在缺失,导致格式化时无法解析MMMM模式,最终 fallback 输出月份数字。以下是几种可靠的解决方法:
方法一:手动映射月份名称(最稳定,不依赖系统资源)
回历的英文月份名称是固定的,直接定义一个映射数组,根据月份数值获取对应名称即可,完全规避系统资源缺失的问题:
// 定义回历英文月份名称数组,索引对应月份数值(1-12) private static final String[] HIJRAH_MONTH_NAMES = { "", "Muharram", "Safar", "Rabi' al-Awwal", "Rabi' al-Thani", "Jumada al-Ula", "Jumada al-Thani", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhu al-Qi'dah", "Dhu al-Hijjah" }; // 使用示例 HijrahDate date = HijrahDate.from(LocalDate.of(2024, 4, 11)); int monthValue = date.getMonth().getValue(); String monthName = HIJRAH_MONTH_NAMES[monthValue]; System.out.println(monthName); // 输出 Shawwal
方法二:显式指定完整Locale并强制识别日历系统
Android的本地化依赖ICU库,部分Locale的伊斯兰历资源可能未完全打包。可以尝试使用更明确的Locale,或显式指定日历系统确保格式化逻辑正确:
HijrahDate date = HijrahDate.from(LocalDate.of(2024, 4, 11)); // 尝试使用Locale.ENGLISH,部分场景下对应资源更完整 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM", Locale.ENGLISH); // 显式绑定伊斯兰历系统,避免格式化时混淆日历类型 formatter = formatter.withChronology(HijrahChronology.INSTANCE); System.out.println(formatter.format(date));
方法三:引入ThreeTenABP库(适配资源缺失严重的设备)
如果项目允许引入第三方库,ThreeTenABP是Android上java.time的完整实现,包含更全面的本地化资源:
- 在
build.gradle中添加依赖:
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6'
- 在Application类中初始化:
@Override public void onCreate() { super.onCreate(); AndroidThreeTen.init(this); }
- 使用ThreeTenABP的API格式化日期:
HijrahDate date = HijrahDate.from(LocalDate.of(2024, 4, 11)); System.out.println(DateTimeFormatter.ofPattern("MMMM", Locale.US).format(date));
内容的提问来源于stack exchange,提问作者Milan Fabian
相关产品推荐
相关产品推荐

