- 所有已实现的接口:
-
Serializable
,Comparable<Chronology>
,Chronology
伊斯兰历遵循伊斯兰历法规则。伊斯兰历有几种变体,基于确定新月出现的时间和观测地点的不同。在某些变体中,每个月的长度是根据月亮和地球的天文数据算法计算的,而在其他变体中,月份的长度是由授权的新月观测确定的。对于基于算法的日历,日历可以预测未来。对于基于观测的日历,只能使用过去观测的历史数据。
每个月的长度为29或30天。普通年有354天;闰年有355天。
CLDR和LDML标识变体:
年表ID | 日历类型 | 区域扩展,参见Locale |
描述 |
---|---|---|---|
Hijrah-umalqura | islamic-umalqura | ca-islamic-umalqura | 沙特阿拉伯伊斯兰-乌姆尔古拉日历 |
更多变体可以通过Chronology.getAvailableChronologies()
获得。
示例
从区域设置中选择年表使用Chronology.ofLocale(java.util.Locale)
来查找基于区域支持的BCP 47扩展机制请求特定日历("ca")的年表。例如,
Locale locale = Locale.forLanguageTag("en-US-u-ca-islamic-umalqura"); Chronology chrono = Chronology.ofLocale(locale);
- 实现要求:
- 此类是不可变且线程安全的。
- 实现说明:
-
每个伊斯兰历变体都是单独配置的。每个变体由一个属性资源定义,该属性资源定义了
ID
、日历类型
、日历的开始、与ISO日历的对齐以及一定年份范围内每个月的长度。这些变体由HijrahChronology作为资源从hijrah-config-<calendar type>.properties加载。伊斯兰历属性资源是描述日历的一组属性。语法由
java.util.Properties#load(Reader)
定义。属性名称 属性值 描述 id 年表ID,例如,"Hijrah-umalqura" 常用的日历ID type 日历类型,例如,"islamic-umalqura" LDML定义了日历类型 version 版本,例如:"1.8.0_1" 伊斯兰历变体数据的版本 iso-start ISO开始日期,格式为 yyyy-MM-dd
,例如:"1900-04-30"最小Hijrah年的第一天的ISO日期。 yyyy - 数字4位年份,例如"1434" 该值是12个月长度的序列,例如:"29 30 29 30 29 30 30 30 29 30 29 29" 年份的12个月的长度,以空格分隔。每年必须有一个数字年属性,没有任何间隙。月份长度必须在29-32之间。 通过在
<JAVA_HOME>/conf/chronology
目录中提供配置属性文件可以添加更多变体。属性文件应遵循hijrah-config-<chronology id>_<calendar type>.properties
的命名约定。 - 自:
- 1.8
- 参见:
-
Field Summary
-
Method Summary
Modifier and TypeMethodDescriptiondate
(int prolepticYear, int month, int dayOfMonth) 从纪元年、年份和月份字段获取伊斯兰历系统中的本地日期。从纪元、年份、月份和日期字段获取伊斯兰历系统中的本地日期。date
(TemporalAccessor temporal) 从另一个时间对象获取此年表中的本地日期。dateEpochDay
(long epochDay) 从纪元日获取伊斯兰历系统中的本地日期。dateNow()
从默认时区的系统时钟获取此年表中的当前本地日期。从指定时钟获取此年表中的当前本地日期。从指定时区的系统时钟获取此年表中的当前本地日期。dateYearDay
(int prolepticYear, int dayOfYear) 从纪元年和年中的日期字段获取伊斯兰历系统中的本地日期。dateYearDay
(Era era, int yearOfEra, int dayOfYear) 从纪元、年份和年中的日期字段获取伊斯兰历系统中的本地日期。eraOf
(int eraValue) 从数字值创建HijrahEra对象。eras()
获取年表的纪元列表。获取伊斯兰日历的日历类型。getId()
获取年表的ID。boolean
isLeapYear
(long prolepticYear) 检查指定年份是否为闰年。localDateTime
(TemporalAccessor temporal) 从另一个时间对象获取此年表中的本地日期时间。int
prolepticYear
(Era era, int yearOfEra) 给定纪元和年份的情况下计算纪元年。range
(ChronoField field) 获取指定字段的有效值范围。resolveDate
(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle) 在解析期间将解析的ChronoField
值解析为日期。zonedDateTime
(Instant instant, ZoneId zone) 从Instant
获取此年表中的ChronoZonedDateTime
。zonedDateTime
(TemporalAccessor temporal) 从另一个时间对象获取此年表中的ChronoZonedDateTime
。Methods declared in class java.time.chrono.AbstractChronology
compareTo, equals, hashCode, toString
Methods declared in class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods declared in interface java.time.chrono.Chronology
epochSecond, epochSecond, getDisplayName, isIsoBased, period
-
Field Details
-
INSTANCE
沙特阿拉伯伊斯兰乌姆尔古拉日历的单例实例。其他伊斯兰历变体可能可以通过Chronology.getAvailableChronologies()
获得。
-
-
Method Details
-
getId
获取年表的ID。ID唯一标识
Chronology
。可以使用Chronology.of(String)
查找Chronology
。- 指定者:
-
getId
在接口Chronology
中 - 返回:
- 年表ID,非空
- 参见:
-
getCalendarType
获取伊斯兰日历的日历类型。日历类型是由Unicode区域数据标记语言(LDML)规范定义的标识符。可以使用
Chronology.of(String)
查找Chronology
。- 指定者:
-
getCalendarType
在接口Chronology
中 - 返回:
- 日历系统类型;如果日历具有标准类型,则非空,否则为空
- 参见:
-
date
从纪元、年代、年份和日期字段获取伊斯兰历系统中的本地日期。- 指定者:
-
date
在接口Chronology
中 - 参数:
-
era
- 伊斯兰纪元,非空 -
yearOfEra
- 年代 -
month
- 年中的月份 -
dayOfMonth
- 月中的日期 - 返回:
- 伊斯兰本地日期,非空
- 抛出:
-
DateTimeException
- 如果无法创建日期 -
ClassCastException
- 如果era
不是HijrahEra
-
date
从纪元年、年份和月份字段获取伊斯兰历系统中的本地日期。- 指定者:
-
date
在接口Chronology
中 - 参数:
-
prolepticYear
- 纪元年 -
month
- 年中的月份 -
dayOfMonth
- 月中的日期 - 返回:
- 伊斯兰本地日期,非空
- 抛出:
-
DateTimeException
- 如果无法创建日期
-
dateYearDay
从纪元、年代和年中的日期字段获取伊斯兰历系统中的本地日期。- 指定者:
-
dateYearDay
在接口Chronology
中 - 参数:
-
era
- 伊斯兰历纪元,不能为空 -
yearOfEra
- 纪元年份 -
dayOfYear
- 年中的第几天 - 返回:
- 伊斯兰历本地日期,不能为空
- 抛出:
-
DateTimeException
- 如果无法创建日期 -
ClassCastException
- 如果era
不是HijrahEra
-
dateYearDay
从纪元年和年中的第几天字段获取伊斯兰历日历系统中的本地日期。- 指定者:
-
dateYearDay
在接口Chronology
中 - 参数:
-
prolepticYear
- 纪元年 -
dayOfYear
- 年中的第几天 - 返回:
- 伊斯兰历本地日期,不能为空
- 抛出:
-
DateTimeException
- 如果年份值超出范围,或者年中的第几天对该年份无效
-
dateEpochDay
从纪元日获取伊斯兰历日历系统中的本地日期。- 指定者:
-
dateEpochDay
在接口Chronology
中 - 参数:
-
epochDay
- 纪元日 - 返回:
- 伊斯兰历本地日期,不能为空
- 抛出:
-
DateTimeException
- 如果无法创建日期
-
dateNow
从接口复制的描述:Chronology
从默认时区的系统时钟获取此年表中的当前本地日期。这将查询默认时区中的
系统时钟
以获取当前日期。使用此方法将阻止使用替代时钟进行测试的能力,因为时钟是硬编码的。
- 指定者:
-
dateNow
在接口Chronology
中 - 返回:
- 使用系统时钟和默认时区的当前本地日期,不能为空
-
dateNow
从接口复制的描述:Chronology
从指定时区的系统时钟获取此年表中的当前本地日期。这将查询
系统时钟
以获取当前日期。指定时区避免依赖默认时区。使用此方法将阻止使用替代时钟进行测试的能力,因为时钟是硬编码的。
- 指定者:
-
dateNow
在接口Chronology
中 - 参数:
-
zone
- 要使用的区域ID,不能为空 - 返回:
- 使用系统时钟的当前本地日期,不能为空
-
dateNow
从接口复制的描述:Chronology
从指定时钟获取此年表中的当前本地日期。这将查询指定的时钟以获取当前日期 - 今天。使用此方法允许使用替代时钟进行测试。可以使用
依赖注入
引入替代时钟。- 指定者:
-
dateNow
在接口Chronology
中 - 参数:
-
clock
- 要使用的时钟,不能为空 - 返回:
- 当前本地日期,不能为空
-
date
从接口复制的描述:Chronology
从另一个时间对象获取此年表中的本地日期。根据指定的时间对象在此年表中获取日期。
TemporalAccessor
表示一组任意的日期和时间信息,此工厂将其转换为ChronoLocalDate
的实例。转换通常使用
EPOCH_DAY
字段,该字段在各种日历系统中是标准化的。此方法与函数接口
TemporalQuery
的签名匹配,允许通过方法引用aChronology::date
来使用它作为查询。- 指定者:
-
date
在接口Chronology
中 - 参数:
-
temporal
- 要转换的时间对象,不能为空 - 返回:
- 此年表中的本地日期,不能为空
- 参见:
-
localDateTime
从接口复制的描述:Chronology
从另一个时间对象获取此年表中的本地日期时间。根据指定的时间对象在此年表中获取日期时间。
TemporalAccessor
表示一组任意的日期和时间信息,此工厂将其转换为ChronoLocalDateTime
的实例。转换提取并组合时间对象中的
ChronoLocalDate
和LocalTime
。实现允许执行优化,例如访问等效于相关对象的字段。结果使用此年表。此方法与函数接口
TemporalQuery
的签名匹配,允许通过方法引用aChronology::localDateTime
来使用它作为查询。- 指定者:
-
localDateTime
在接口Chronology
中 - 参数:
-
temporal
- 要转换的时间对象,不能为空 - 返回:
- 此年表中的本地日期时间,不能为空
- 参见:
-
zonedDateTime
从接口复制的描述:Chronology
从另一个时间对象获取此年表中的ChronoZonedDateTime
。根据指定的时间对象在此年表中获取带时区的日期时间。
TemporalAccessor
表示一组任意的日期和时间信息,此工厂将其转换为ChronoZonedDateTime
的实例。转换将首先从时间对象获取
ZoneId
,必要时返回到ZoneOffset
。然后尝试获取Instant
,必要时返回到ChronoLocalDateTime
。结果将是ZoneId
或ZoneOffset
与Instant
或ChronoLocalDateTime
的组合。实现允许执行优化,例如访问等效于相关对象的字段。结果使用此年表。此方法与函数接口
TemporalQuery
的签名匹配,允许通过方法引用aChronology::zonedDateTime
来使用它作为查询。- 指定者:
-
zonedDateTime
在接口Chronology
中 - 参数:
-
temporal
- 要转换的时间对象,不能为空 - 返回:
- 此年表中的带时区的日期时间,不能为空
- 参见:
-
zonedDateTime
从接口复制的描述:Chronology
从Instant
获取此年表中的ChronoZonedDateTime
。获取与指定时间相同的带时区的日期时间。
- 指定者:
-
zonedDateTime
在接口Chronology
中 - 参数:
-
instant
- 用于创建日期时间的即时时间,不能为空 -
zone
- 时区,不能为空 - 返回值:
- 有时区的日期时间,不能为空
-
isLeapYear
public boolean isLeapYear(long prolepticYear) 从接口复制的描述:Chronology
检查指定的年份是否为闰年。闰年是比正常年份长的一年。确切的含义由年表决定,根据以下约束条件:
- 闰年必须意味着年份长度比非闰年长。
- 不支持年份概念的年表必须返回false。
- 对于年表的有效年份范围内的所有年份,必须返回正确的结果。
在有效年份范围之外,实现可以自由返回最佳猜测或false。即使年份超出有效年份范围,实现也不得抛出异常。
- 指定者:
-
isLeapYear
在接口Chronology
中 - 参数:
-
prolepticYear
- 要检查的纪年,未经范围验证 - 返回值:
- 如果年份是闰年则返回true
-
prolepticYear
从接口复制的描述:Chronology
根据纪元和纪元年计算纪年。这将纪元和纪元年合并为单个纪年字段。
如果年表积极使用纪元,例如
JapaneseChronology
,则纪元年将根据纪元进行验证。对于其他年表,验证是可选的。- 指定者:
-
prolepticYear
在接口Chronology
中 - 参数:
-
era
- 适合年表的纪元,不能为空 -
yearOfEra
- 年表纪元年 - 返回值:
- 纪年
-
eraOf
从数值创建HijrahEra对象。Hijrah日历系统只有一个覆盖大于零的纪元。此方法返回值为1时的单例HijrahEra。- 指定者:
-
eraOf
在接口Chronology
中 - 参数:
-
eraValue
- 纪元值 - 返回值:
- 日历系统纪元,不能为空
- 抛出:
-
DateTimeException
- 如果无法创建纪元
-
eras
从接口复制的描述:Chronology
获取年表的纪元列表。大多数日历系统都有一个纪元,其中年份具有意义。如果日历系统不支持纪元概念,则必须返回一个空列表。
- 指定者:
-
eras
在接口Chronology
中 - 返回值:
- 年表的纪元列表,可能是不可变的,不能为空
-
range
从类复制的描述:Chronology
获取指定字段的有效值范围。所有字段都可以表示为
long
整数。此方法返回一个描述该值的有效范围的对象。请注意,结果仅描述最小和最大有效值,重要的是不要读取太多内容。例如,范围内可能存在对该字段无效的值。
无论年表是否支持该字段,此方法都将返回结果。
- 指定者:
-
range
在接口Chronology
中 - 参数:
-
field
- 要获取范围的字段,不能为空 - 返回值:
- 该字段的有效值范围,不能为空
-
resolveDate
从类复制的描述:AbstractChronology
在解析期间将解析的ChronoField
值解析为日期。大多数
TemporalField
实现都使用字段上的解析方法进行解析。相比之下,ChronoField
类定义的字段仅相对于年表具有意义。因此,在此处解析ChronoField
日期字段是在特定年表的上下文中进行的。ChronoField
实例由此方法解析,可以在子类中重写。EPOCH_DAY
- 如果存在,则将其转换为日期,然后所有其他日期字段将与日期进行交叉检查。PROLEPTIC_MONTH
- 如果存在,则将其拆分为YEAR
和MONTH_OF_YEAR
。如果模式是严格或智能,则将验证该字段。YEAR_OF_ERA
和ERA
- 如果两者都存在,则将它们组合成一个YEAR
。在宽松模式中,不会验证YEAR_OF_ERA
范围,在智能和严格模式中会验证。在所有三种模式中,将验证ERA
的范围。如果只有YEAR_OF_ERA
存在,并且模式是智能或宽松,则假定最后一个可用的纪元。在严格模式下,不会假定任何纪元,YEAR_OF_ERA
保持不变。如果只有ERA
存在,则保持不变。YEAR
、MONTH_OF_YEAR
和DAY_OF_MONTH
- 如果三者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR
。如果模式是智能或严格,则将验证月份和日期。如果模式是宽松的,则将以等同于在请求的年份的第一个月的第一天创建日期的方式组合日期,然后添加月份的差异,然后添加日期的差异。如果模式是智能的,并且日期大于年月的最大日期,则日期将调整为最后一天。如果模式是严格的,则三个字段必须形成有效日期。YEAR
和DAY_OF_YEAR
- 如果两者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR
。如果模式是宽松的,则将以等同于在请求的年份的第一天创建日期的方式组合日期,然后添加日期的差异。如果模式是智能或严格的,则两个字段必须形成有效日期。YEAR
、MONTH_OF_YEAR
、ALIGNED_WEEK_OF_MONTH
和ALIGNED_DAY_OF_WEEK_IN_MONTH
- 如果四者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR
。如果模式是宽松的,则将以等同于在请求的年份的第一个月的第一天创建日期的方式组合日期,然后添加月份的差异,然后添加周数的差异,然后添加日期的差异。如果模式是智能或严格的,则所有四个字段将验证到其外部范围。然后将日期组合成等同于在请求的年份和月份的第一天创建日期的方式,然后添加周数和日期以达到它们的值。如果模式是严格的,则还将验证日期以检查日期和周调整是否更改了月份。YEAR
、MONTH_OF_YEAR
、ALIGNED_WEEK_OF_MONTH
和DAY_OF_WEEK
- 如果四者都存在,则将它们组合成一个日期。对于年份、月份和周在ALIGNED_DAY_OF_WEEK_IN_MONTH
中的处理方式与上述描述相同。一旦处理了年份、月份和周,就会调整星期几为下一个或相同匹配的星期几。YEAR
、ALIGNED_WEEK_OF_YEAR
和ALIGNED_DAY_OF_WEEK_IN_YEAR
- 如果三者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR
。如果模式是宽松的,则将以等同于在请求的年份的第一天创建日期的方式组合日期,然后添加周数的差异,然后添加日期的差异。如果模式是智能或严格的,则所有三个字段将验证到其外部范围。然后将日期组合成等同于在请求的年份的第一天创建日期的方式,然后添加周数和日期以达到它们的值。如果模式是严格的,则还将验证日期以检查日期和周调整是否更改了年份。YEAR
、ALIGNED_WEEK_OF_YEAR
和DAY_OF_WEEK
- 如果三者都存在,则将它们组合成一个日期。对于年份和周在ALIGNED_DAY_OF_WEEK_IN_YEAR
中的处理方式与上述描述相同。一旦处理了年份和周,就会调整星期几为下一个或相同匹配的星期几。
默认实现适用于大多数日历系统。如果找到
ChronoField.YEAR_OF_ERA
而没有ChronoField.ERA
,则将使用Chronology.eras()
中的最后一个纪元。该实现假定一周为7天,每月的第一天值为1,每年的第一天值为1,并且每月和每年的第一天始终存在。- 指定者:
-
resolveDate
在接口Chronology
中 - 覆盖:
-
resolveDate
在类AbstractChronology
中 - 参数:
-
fieldValues
- 字段到值的映射,可以更新,不能为空 -
resolverStyle
- 请求的解析类型,不能为空 - 返回:
- 已解析的日期,如果信息不足以创建日期则返回null
-