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

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的完整实现,包含更全面的本地化资源:

  1. 在build.gradle中添加依赖:
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6'
  1. 在Application类中初始化:
@Override
public void onCreate() {
    super.onCreate();
    AndroidThreeTen.init(this);
}
  1. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:16