HijrahDate 是 Java 8 提供的基于 Umm al-Qura 日历(沙特官方)的伊斯兰教历日期类,仅支持该确定性算法变体,不兼容其他伊斯兰历法,需通过静态工厂创建、注意月份从1起、格式化须显式绑定 HijrahChronology。

HijrahDate 是 Java 8 引入的 java.time.chrono 包中的一个类,用于表示伊斯兰教历(Hijri 日历)的日期。它基于 Umm al-Qura 日历(沙特阿拉伯官方采用的变体),而非纯天文计算或所有穆斯林地区通用的阴历变体。使用时需注意其设计目标和局限性。
理解 HijrahDate 的日历基础
Java 的 HijrahDate 默认实现是 HijrahChronology,对应的是 Umm al-Qura 日历系统(以麦加为基准,由沙特官方发布)。该日历采用确定性算法推算每月起始(基于月龄阈值 + 地理规则),不是实时天文观测结果,也不支持其他主流变体(如 Islamic Civil Calendar 或 Tabular Islamic Calendar)。
- 月份长度固定为 29 或 30 天,交替为主,但按算法调整
- 一年通常 354 或 355 天,不闰月,靠每月初一判定校准
- 不提供“斋月”“朝觐月”等宗教标签,仅提供年-月-日数值
创建和获取 HijrahDate 实例
不能直接 new,必须通过静态工厂方法或转换获得:
-
HijrahDate.now():获取当前系统时区下的默认 Hijrah 日期 -
HijrahDate.of(1445, 9, 1):构造指定年、月、日(注意:月从 1 开始,不是 0) -
HijrahDate.from(LocalDate.of(2024, 4, 10)):将公历日期转为对应 Hijrah 日期(基于 Umm al-Qura 映射表) -
LocalDate.from(HijrahDate.of(1445, 9, 1)):反向转换(精度到日,无时间信息)
格式化与解析 Hijrah 日期
Java 的 DateTimeFormatter 支持 Hijrah 日期,但需显式指定 chronology:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用
DateTimeFormatter.ofPattern("dd MMM uuuu", new Locale("ar"))可输出阿拉伯文月份名(需系统有对应 locale 支持) - 更可靠的方式是用
DateTimeFormatterBuilder绑定HijrahChronology.INSTANCE - 解析时建议用带 chronology 的 formatter,否则可能默认走 ISO,导致异常
示例:
DateTimeFormatter hFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd")
.toFormatter().withChronology(HijrahChronology.INSTANCE);
HijrahDate date = HijrahDate.parse("1445-09-01", hFormatter);
注意事项和常见陷阱
HijrahDate 不是“万能伊斯兰日历工具”,实际使用中容易踩坑:
- 不同国家/组织使用的 Hijri 日历不同(如土耳其、伊朗、埃及各有算法),Java 只实现 Umm al-Qura
- 没有内置节假日或宗教事件计算(如开斋节需查表或调用外部 API)
- 时区不影响 HijrahDate 本身(它是纯日期),但
now()依赖系统默认时区的本地日期 - 跨年计算(如判断是否进入斋月)需手动比对月份字段,不能依赖周期性规则

















