Module java.base
Package java.time.chrono

Class HijrahChronology

java.lang.Object
java.time.chrono.AbstractChronology
java.time.chrono.HijrahChronology
所有已实现的接口:
Serializable, Comparable<Chronology>, Chronology

public final class HijrahChronology extends AbstractChronology implements Serializable
伊斯兰历是一种支持伊斯兰日历的阴历日历。

伊斯兰历遵循伊斯兰历法规则。伊斯兰历有几种变体,基于确定新月出现的时间和观测地点的不同。在某些变体中,每个月的长度是根据月亮和地球的天文数据算法计算的,而在其他变体中,月份的长度是由授权的新月观测确定的。对于基于算法的日历,日历可以预测未来。对于基于观测的日历,只能使用过去观测的历史数据。

每个月的长度为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 Details

  • Method Details

    • getId

      public String getId()
      获取年表的ID。

      ID唯一标识Chronology。可以使用Chronology.of(String)查找Chronology

      指定者:
      getId 在接口 Chronology
      返回:
      年表ID,非空
      参见:
    • getCalendarType

      public String getCalendarType()
      获取伊斯兰日历的日历类型。

      日历类型是由Unicode区域数据标记语言(LDML)规范定义的标识符。可以使用Chronology.of(String)查找Chronology

      指定者:
      getCalendarType 在接口 Chronology
      返回:
      日历系统类型;如果日历具有标准类型,则非空,否则为空
      参见:
    • date

      public HijrahDate date(Era era, int yearOfEra, int month, int dayOfMonth)
      从纪元、年代、年份和日期字段获取伊斯兰历系统中的本地日期。
      指定者:
      date 在接口 Chronology
      参数:
      era - 伊斯兰纪元,非空
      yearOfEra - 年代
      month - 年中的月份
      dayOfMonth - 月中的日期
      返回:
      伊斯兰本地日期,非空
      抛出:
      DateTimeException - 如果无法创建日期
      ClassCastException - 如果era不是HijrahEra
    • date

      public HijrahDate date(int prolepticYear, int month, int dayOfMonth)
      从纪元年、年份和月份字段获取伊斯兰历系统中的本地日期。
      指定者:
      date 在接口 Chronology
      参数:
      prolepticYear - 纪元年
      month - 年中的月份
      dayOfMonth - 月中的日期
      返回:
      伊斯兰本地日期,非空
      抛出:
      DateTimeException - 如果无法创建日期
    • dateYearDay

      public HijrahDate dateYearDay(Era era, int yearOfEra, int dayOfYear)
      从纪元、年代和年中的日期字段获取伊斯兰历系统中的本地日期。
      指定者:
      dateYearDay 在接口 Chronology
      参数:
      era - 伊斯兰历纪元,不能为空
      yearOfEra - 纪元年份
      dayOfYear - 年中的第几天
      返回:
      伊斯兰历本地日期,不能为空
      抛出:
      DateTimeException - 如果无法创建日期
      ClassCastException - 如果era不是HijrahEra
    • dateYearDay

      public HijrahDate dateYearDay(int prolepticYear, int dayOfYear)
      从纪元年和年中的第几天字段获取伊斯兰历日历系统中的本地日期。
      指定者:
      dateYearDay 在接口 Chronology
      参数:
      prolepticYear - 纪元年
      dayOfYear - 年中的第几天
      返回:
      伊斯兰历本地日期,不能为空
      抛出:
      DateTimeException - 如果年份值超出范围,或者年中的第几天对该年份无效
    • dateEpochDay

      public HijrahDate dateEpochDay(long epochDay)
      从纪元日获取伊斯兰历日历系统中的本地日期。
      指定者:
      dateEpochDay 在接口 Chronology
      参数:
      epochDay - 纪元日
      返回:
      伊斯兰历本地日期,不能为空
      抛出:
      DateTimeException - 如果无法创建日期
    • dateNow

      public HijrahDate dateNow()
      从接口复制的描述: Chronology
      从默认时区的系统时钟获取此年表中的当前本地日期。

      这将查询默认时区中的系统时钟以获取当前日期。

      使用此方法将阻止使用替代时钟进行测试的能力,因为时钟是硬编码的。

      指定者:
      dateNow 在接口 Chronology
      返回:
      使用系统时钟和默认时区的当前本地日期,不能为空
    • dateNow

      public HijrahDate dateNow(ZoneId zone)
      从接口复制的描述: Chronology
      从指定时区的系统时钟获取此年表中的当前本地日期。

      这将查询系统时钟以获取当前日期。指定时区避免依赖默认时区。

      使用此方法将阻止使用替代时钟进行测试的能力,因为时钟是硬编码的。

      指定者:
      dateNow 在接口 Chronology
      参数:
      zone - 要使用的区域ID,不能为空
      返回:
      使用系统时钟的当前本地日期,不能为空
    • dateNow

      public HijrahDate dateNow(Clock clock)
      从接口复制的描述: Chronology
      从指定时钟获取此年表中的当前本地日期。

      这将查询指定的时钟以获取当前日期 - 今天。使用此方法允许使用替代时钟进行测试。可以使用依赖注入引入替代时钟。

      指定者:
      dateNow 在接口 Chronology
      参数:
      clock - 要使用的时钟,不能为空
      返回:
      当前本地日期,不能为空
    • date

      public HijrahDate date(TemporalAccessor temporal)
      从接口复制的描述: Chronology
      从另一个时间对象获取此年表中的本地日期。

      根据指定的时间对象在此年表中获取日期。 TemporalAccessor表示一组任意的日期和时间信息,此工厂将其转换为ChronoLocalDate的实例。

      转换通常使用EPOCH_DAY字段,该字段在各种日历系统中是标准化的。

      此方法与函数接口TemporalQuery的签名匹配,允许通过方法引用aChronology::date来使用它作为查询。

      指定者:
      date 在接口 Chronology
      参数:
      temporal - 要转换的时间对象,不能为空
      返回:
      此年表中的本地日期,不能为空
      参见:
    • localDateTime

      public ChronoLocalDateTime<HijrahDate> localDateTime(TemporalAccessor temporal)
      从接口复制的描述: Chronology
      从另一个时间对象获取此年表中的本地日期时间。

      根据指定的时间对象在此年表中获取日期时间。 TemporalAccessor表示一组任意的日期和时间信息,此工厂将其转换为ChronoLocalDateTime的实例。

      转换提取并组合时间对象中的ChronoLocalDateLocalTime。实现允许执行优化,例如访问等效于相关对象的字段。结果使用此年表。

      此方法与函数接口TemporalQuery的签名匹配,允许通过方法引用aChronology::localDateTime来使用它作为查询。

      指定者:
      localDateTime 在接口 Chronology
      参数:
      temporal - 要转换的时间对象,不能为空
      返回:
      此年表中的本地日期时间,不能为空
      参见:
    • zonedDateTime

      public ChronoZonedDateTime<HijrahDate> zonedDateTime(TemporalAccessor temporal)
      从接口复制的描述: Chronology
      从另一个时间对象获取此年表中的ChronoZonedDateTime

      根据指定的时间对象在此年表中获取带时区的日期时间。 TemporalAccessor表示一组任意的日期和时间信息,此工厂将其转换为ChronoZonedDateTime的实例。

      转换将首先从时间对象获取ZoneId,必要时返回到ZoneOffset。然后尝试获取Instant,必要时返回到ChronoLocalDateTime。结果将是ZoneIdZoneOffsetInstantChronoLocalDateTime的组合。实现允许执行优化,例如访问等效于相关对象的字段。结果使用此年表。

      此方法与函数接口TemporalQuery的签名匹配,允许通过方法引用aChronology::zonedDateTime来使用它作为查询。

      指定者:
      zonedDateTime 在接口 Chronology
      参数:
      temporal - 要转换的时间对象,不能为空
      返回:
      此年表中的带时区的日期时间,不能为空
      参见:
    • zonedDateTime

      public ChronoZonedDateTime<HijrahDate> zonedDateTime(Instant instant, ZoneId zone)
      从接口复制的描述: Chronology
      Instant获取此年表中的ChronoZonedDateTime

      获取与指定时间相同的带时区的日期时间。

      指定者:
      zonedDateTime 在接口 Chronology
      参数:
      instant - 用于创建日期时间的即时时间,不能为空
      zone - 时区,不能为空
      返回值:
      有时区的日期时间,不能为空
    • isLeapYear

      public boolean isLeapYear(long prolepticYear)
      从接口复制的描述: Chronology
      检查指定的年份是否为闰年。

      闰年是比正常年份长的一年。确切的含义由年表决定,根据以下约束条件:

      • 闰年必须意味着年份长度比非闰年长。
      • 不支持年份概念的年表必须返回false。
      • 对于年表的有效年份范围内的所有年份,必须返回正确的结果。

      在有效年份范围之外,实现可以自由返回最佳猜测或false。即使年份超出有效年份范围,实现也不得抛出异常。

      指定者:
      isLeapYear 在接口 Chronology
      参数:
      prolepticYear - 要检查的纪年,未经范围验证
      返回值:
      如果年份是闰年则返回true
    • prolepticYear

      public int prolepticYear(Era era, int yearOfEra)
      从接口复制的描述: Chronology
      根据纪元和纪元年计算纪年。

      这将纪元和纪元年合并为单个纪年字段。

      如果年表积极使用纪元,例如JapaneseChronology,则纪元年将根据纪元进行验证。对于其他年表,验证是可选的。

      指定者:
      prolepticYear 在接口 Chronology
      参数:
      era - 适合年表的纪元,不能为空
      yearOfEra - 年表纪元年
      返回值:
      纪年
    • eraOf

      public HijrahEra eraOf(int eraValue)
      从数值创建HijrahEra对象。Hijrah日历系统只有一个覆盖大于零的纪元。此方法返回值为1时的单例HijrahEra。
      指定者:
      eraOf 在接口 Chronology
      参数:
      eraValue - 纪元值
      返回值:
      日历系统纪元,不能为空
      抛出:
      DateTimeException - 如果无法创建纪元
    • eras

      public List<Era> eras()
      从接口复制的描述: Chronology
      获取年表的纪元列表。

      大多数日历系统都有一个纪元,其中年份具有意义。如果日历系统不支持纪元概念,则必须返回一个空列表。

      指定者:
      eras 在接口 Chronology
      返回值:
      年表的纪元列表,可能是不可变的,不能为空
    • range

      public ValueRange range(ChronoField field)
      从类复制的描述: Chronology
      获取指定字段的有效值范围。

      所有字段都可以表示为long整数。此方法返回一个描述该值的有效范围的对象。

      请注意,结果仅描述最小和最大有效值,重要的是不要读取太多内容。例如,范围内可能存在对该字段无效的值。

      无论年表是否支持该字段,此方法都将返回结果。

      指定者:
      range 在接口 Chronology
      参数:
      field - 要获取范围的字段,不能为空
      返回值:
      该字段的有效值范围,不能为空
    • resolveDate

      public HijrahDate resolveDate(Map<TemporalField,Long> fieldValues, ResolverStyle resolverStyle)
      从类复制的描述: AbstractChronology
      在解析期间将解析的ChronoField值解析为日期。

      大多数TemporalField实现都使用字段上的解析方法进行解析。相比之下,ChronoField类定义的字段仅相对于年表具有意义。因此,在此处解析ChronoField日期字段是在特定年表的上下文中进行的。

      ChronoField实例由此方法解析,可以在子类中重写。

      • EPOCH_DAY - 如果存在,则将其转换为日期,然后所有其他日期字段将与日期进行交叉检查。
      • PROLEPTIC_MONTH - 如果存在,则将其拆分为YEARMONTH_OF_YEAR。如果模式是严格或智能,则将验证该字段。
      • YEAR_OF_ERAERA - 如果两者都存在,则将它们组合成一个YEAR。在宽松模式中,不会验证YEAR_OF_ERA范围,在智能和严格模式中会验证。在所有三种模式中,将验证ERA的范围。如果只有YEAR_OF_ERA存在,并且模式是智能或宽松,则假定最后一个可用的纪元。在严格模式下,不会假定任何纪元,YEAR_OF_ERA保持不变。如果只有ERA存在,则保持不变。
      • YEARMONTH_OF_YEARDAY_OF_MONTH - 如果三者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR。如果模式是智能或严格,则将验证月份和日期。如果模式是宽松的,则将以等同于在请求的年份的第一个月的第一天创建日期的方式组合日期,然后添加月份的差异,然后添加日期的差异。如果模式是智能的,并且日期大于年月的最大日期,则日期将调整为最后一天。如果模式是严格的,则三个字段必须形成有效日期。
      • YEARDAY_OF_YEAR - 如果两者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR。如果模式是宽松的,则将以等同于在请求的年份的第一天创建日期的方式组合日期,然后添加日期的差异。如果模式是智能或严格的,则两个字段必须形成有效日期。
      • YEARMONTH_OF_YEARALIGNED_WEEK_OF_MONTHALIGNED_DAY_OF_WEEK_IN_MONTH - 如果四者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR。如果模式是宽松的,则将以等同于在请求的年份的第一个月的第一天创建日期的方式组合日期,然后添加月份的差异,然后添加周数的差异,然后添加日期的差异。如果模式是智能或严格的,则所有四个字段将验证到其外部范围。然后将日期组合成等同于在请求的年份和月份的第一天创建日期的方式,然后添加周数和日期以达到它们的值。如果模式是严格的,则还将验证日期以检查日期和周调整是否更改了月份。
      • YEARMONTH_OF_YEARALIGNED_WEEK_OF_MONTHDAY_OF_WEEK - 如果四者都存在,则将它们组合成一个日期。对于年份、月份和周在ALIGNED_DAY_OF_WEEK_IN_MONTH中的处理方式与上述描述相同。一旦处理了年份、月份和周,就会调整星期几为下一个或相同匹配的星期几。
      • YEARALIGNED_WEEK_OF_YEARALIGNED_DAY_OF_WEEK_IN_YEAR - 如果三者都存在,则将它们组合成一个日期。在所有三种模式中,将验证YEAR。如果模式是宽松的,则将以等同于在请求的年份的第一天创建日期的方式组合日期,然后添加周数的差异,然后添加日期的差异。如果模式是智能或严格的,则所有三个字段将验证到其外部范围。然后将日期组合成等同于在请求的年份的第一天创建日期的方式,然后添加周数和日期以达到它们的值。如果模式是严格的,则还将验证日期以检查日期和周调整是否更改了年份。
      • YEARALIGNED_WEEK_OF_YEARDAY_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