Class IslamicCalendar

java.lang.Object
com.ibm.icu.util.Calendar
com.ibm.icu.util.IslamicCalendar
All Implemented Interfaces:
Serializable, Cloneable, Comparable<Calendar>

public class IslamicCalendar extends Calendar
IslamicCalendar is a subclass of Calendar that that implements the Islamic civil and religious calendars. It is used as the civil calendar in most of the Arab world and the liturgical calendar of the Islamic faith worldwide. This calendar is also known as the "Hijri" calendar, since it starts at the time of Mohammed's emigration (or "hijra") to Medinah on Thursday, July 15, 622 AD (Julian).

The Islamic calendar is strictly lunar, and thus an Islamic year of twelve lunar months does not correspond to the solar year used by most other calendar systems, including the Gregorian. An Islamic year is, on average, about 354 days long, so each successive Islamic year starts about 11 days earlier in the corresponding Gregorian year.

Each month of the calendar starts when the new moon's crescent is visible at sunset. However, in order to keep the time fields in this class synchronized with those of the other calendars and with local clock time, we treat days and months as beginning at midnight, roughly 6 hours after the corresponding sunset.

There are three main variants of the Islamic calendar in existence. The first is the civil calendar, which uses a fixed cycle of alternating 29- and 30-day months, with a leap day added to the last month of 11 out of every 30 years. This calendar is easily calculated and thus predictable in advance, so it is used as the civil calendar in a number of Arab countries. This is the default behavior of a newly-created IslamicCalendar object.

The Islamic religious calendar and Saudi Arabia's Umm al-Qura calendar, however, are based on the observation of the crescent moon. It is thus affected by the position at which the observations are made, seasonal variations in the time of sunset, the eccentricities of the moon's orbit, and even the weather at the observation site. This makes it impossible to calculate in advance, and it causes the start of a month in the religious calendar to differ from the civil calendar by up to three days.

Using astronomical calculations for the position of the sun and moon, the moon's illumination, and other factors, it is possible to determine the start of a lunar month with a fairly high degree of certainty. However, these calculations are extremely complicated and thus slow, so most algorithms, including the one used here, are only approximations of the true astronomical calculations. At present, the approximations used in this class are fairly simplistic; they will be improved in later versions of the code.

Like the Islamic religious calendar, Umm al-Qura is also based on the sighting method of the crescent moon but is standardized by Saudi Arabia.

The setCalculationType method determines which approach is used to determine the start of a month. By default, the fixed-cycle civil calendar is used. However, if setCalculationType(ISLAMIC) is called, an approximation of the true lunar calendar will be used. Similarly, if setCalculationType(ISLAMIC_UMALQURA) is called, an approximation of the Umm al-Qura lunar calendar will be used.

This class should not be subclassed.

IslamicCalendar usually should be instantiated using Calendar.getInstance(ULocale) passing in a ULocale with the tag "@calendar=islamic" or "@calendar=islamic-civil" or "@calendar=islamic-umalqura".

See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • MUHARRAM

      public static final int MUHARRAM
      Constant for Muharram, the 1st month of the Islamic year.
      See Also:
    • SAFAR

      public static final int SAFAR
      Constant for Safar, the 2nd month of the Islamic year.
      See Also:
    • RABI_1

      public static final int RABI_1
      Constant for Rabi' al-awwal (or Rabi' I), the 3rd month of the Islamic year.
      See Also:
    • RABI_2

      public static final int RABI_2
      Constant for Rabi' al-thani or (Rabi' II), the 4th month of the Islamic year.
      See Also:
    • JUMADA_1

      public static final int JUMADA_1
      Constant for Jumada al-awwal or (Jumada I), the 5th month of the Islamic year.
      See Also:
    • JUMADA_2

      public static final int JUMADA_2
      Constant for Jumada al-thani or (Jumada II), the 6th month of the Islamic year.
      See Also:
    • RAJAB

      public static final int RAJAB
      Constant for Rajab, the 7th month of the Islamic year.
      See Also:
    • SHABAN

      public static final int SHABAN
      Constant for Sha'ban, the 8th month of the Islamic year.
      See Also:
    • RAMADAN

      public static final int RAMADAN
      Constant for Ramadan, the 9th month of the Islamic year.
      See Also:
    • SHAWWAL

      public static final int SHAWWAL
      Constant for Shawwal, the 10th month of the Islamic year.
      See Also:
    • DHU_AL_QIDAH

      public static final int DHU_AL_QIDAH
      Constant for Dhu al-Qi'dah, the 11th month of the Islamic year.
      See Also:
    • DHU_AL_HIJJAH

      public static final int DHU_AL_HIJJAH
      Constant for Dhu al-Hijjah, the 12th month of the Islamic year.
      See Also:
    • HIJRA_MILLIS

      private static final long HIJRA_MILLIS
      See Also:
    • CIVIL_EPOCH

      private static final long CIVIL_EPOCH
      Friday EPOCH
      See Also:
    • ASTRONOMICAL_EPOCH

      private static final long ASTRONOMICAL_EPOCH
      Thursday EPOCH
      See Also:
    • ISLAMIC_ALGORITHM

      private static IslamicCalendar.Algorithm ISLAMIC_ALGORITHM
    • CIVIL_ALGORITHM

      private static IslamicCalendar.Algorithm CIVIL_ALGORITHM
    • TBLA_ALGORITHM

      private static IslamicCalendar.Algorithm TBLA_ALGORITHM
    • UMALQURA_ALGORITHM

      private static IslamicCalendar.Algorithm UMALQURA_ALGORITHM
    • LIMITS

      private static final int[][] LIMITS
    • UMALQURA_MONTHLENGTH

      private static final int[] UMALQURA_MONTHLENGTH
    • UMALQURA_YEAR_START

      private static final int UMALQURA_YEAR_START
      See Also:
    • UMALQURA_YEAR_END

      private static final int UMALQURA_YEAR_END
      See Also:
    • UMALQURA_YEAR_START_ESTIMATE_FIX

      private static final byte[] UMALQURA_YEAR_START_ESTIMATE_FIX
    • cache

      private static CalendarCache cache
    • civil

      private boolean civil
      true if this object uses the fixed-cycle Islamic civil calendar, and false if it approximates the true religious calendar using astronomical calculations for the time of the new moon.
    • cType

      determines the type of calculation to use for this instance
    • algorithm

      private transient IslamicCalendar.Algorithm algorithm
  • Constructor Details

    • IslamicCalendar

      public IslamicCalendar()
      Constructs a default IslamicCalendar using the current time in the default time zone with the default FORMAT locale.
      See Also:
    • IslamicCalendar

      public IslamicCalendar(TimeZone zone)
      Constructs an IslamicCalendar based on the current time in the given time zone with the default FORMAT locale.
      Parameters:
      zone - the given time zone.
      See Also:
    • IslamicCalendar

      public IslamicCalendar(Locale aLocale)
      Constructs an IslamicCalendar based on the current time in the default time zone with the given locale.
      Parameters:
      aLocale - the given locale.
    • IslamicCalendar

      public IslamicCalendar(ULocale locale)
      Constructs an IslamicCalendar based on the current time in the default time zone with the given locale.
      Parameters:
      locale - the given ulocale.
    • IslamicCalendar

      public IslamicCalendar(TimeZone zone, Locale aLocale)
      Constructs an IslamicCalendar based on the current time in the given time zone with the given locale.
      Parameters:
      zone - the given time zone.
      aLocale - the given locale.
    • IslamicCalendar

      public IslamicCalendar(TimeZone zone, ULocale locale)
      Constructs an IslamicCalendar based on the current time in the given time zone with the given locale.
      Parameters:
      zone - the given time zone.
      locale - the given ulocale.
    • IslamicCalendar

      public IslamicCalendar(Date date)
      Constructs an IslamicCalendar with the given date set in the default time zone with the default FORMAT locale.
      Parameters:
      date - The date to which the new calendar is set.
      See Also:
    • IslamicCalendar

      public IslamicCalendar(int year, int month, int date)
      Constructs an IslamicCalendar with the given date set in the default time zone with the default FORMAT locale.
      Parameters:
      year - the value used to set the YEAR time field in the calendar.
      month - the value used to set the MONTH time field in the calendar. Note that the month value is 0-based. e.g., 0 for Muharram.
      date - the value used to set the DATE time field in the calendar.
      See Also:
    • IslamicCalendar

      public IslamicCalendar(int year, int month, int date, int hour, int minute, int second)
      Constructs an IslamicCalendar with the given date and time set for the default time zone with the default FORMAT locale.
      Parameters:
      year - the value used to set the YEAR time field in the calendar.
      month - the value used to set the MONTH time field in the calendar. Note that the month value is 0-based. e.g., 0 for Muharram.
      date - the value used to set the DATE time field in the calendar.
      hour - the value used to set the HOUR_OF_DAY time field in the calendar.
      minute - the value used to set the MINUTE time field in the calendar.
      second - the value used to set the SECOND time field in the calendar.
      See Also:
  • Method Details

    • setCivil

      public void setCivil(boolean beCivil)
      Determines whether this object uses the fixed-cycle Islamic civil calendar or an approximation of the religious, astronomical calendar.
      Parameters:
      beCivil - true to use the civil calendar, false to use the astronomical calendar.
    • isCivil

      public boolean isCivil()
      Returns true if this object is using the fixed-cycle civil calendar, or false if using the religious, astronomical calendar.
    • handleGetLimit

      protected int handleGetLimit(int field, int limitType)
      Description copied from class: Calendar
      Subclass API for defining limits of different types. Subclasses must implement this method to return limits for the following fields:
      ERA
       YEAR
       MONTH
       WEEK_OF_YEAR
       WEEK_OF_MONTH
       DAY_OF_MONTH
       DAY_OF_YEAR
       DAY_OF_WEEK_IN_MONTH
       YEAR_WOY
       EXTENDED_YEAR
      Specified by:
      handleGetLimit in class Calendar
      Parameters:
      field - one of the above field numbers
      limitType - one of MINIMUM, GREATEST_MINIMUM, LEAST_MAXIMUM, or MAXIMUM
    • civilLeapYear

      private static final boolean civilLeapYear(int year)
      Determine whether a year is a leap year in the Islamic civil calendar
    • yearStart

      private long yearStart(int year)
      Return the day # on which the given year starts. Days are counted from the Hijri epoch, origin 0.
    • trueMonthStart

      private static final long trueMonthStart(long month)
      Find the day number on which a particular month of the true/lunar Islamic calendar starts.
      Parameters:
      month - The month in question, origin 0 from the Hijri epoch
      Returns:
      The day number on which the given month starts.
    • moonAge

      static final double moonAge(long time)
      Return the "age" of the moon at the given time; this is the difference in ecliptic latitude between the moon and the sun. This method simply calls CalendarAstronomer.moonAge, converts to degrees, and adjusts the resultto be in the range [-180, 180].
      Parameters:
      time - The time at which the moon's age is desired, in millis since 1/1/1970.
    • handleGetMonthLength

      protected int handleGetMonthLength(int extendedYear, int month)
      Return the length (in days) of the given month.
      Overrides:
      handleGetMonthLength in class Calendar
      Parameters:
      extendedYear - The hijri year
      month - The hijri month, 0-based
    • handleGetYearLength

      protected int handleGetYearLength(int extendedYear)
      Return the number of days in the given Islamic year
      Overrides:
      handleGetYearLength in class Calendar
    • handleComputeMonthStart

      protected int handleComputeMonthStart(int eyear, int month, boolean useMonth)
      Description copied from class: Calendar
      Returns the Julian day number of day before the first day of the given month in the given extended year. Subclasses should override this method to implement their calendar system.
      Specified by:
      handleComputeMonthStart in class Calendar
      Parameters:
      eyear - the extended year
      month - the zero-based month, or 0 if useMonth is false
      useMonth - if false, compute the day before the first day of the given year, otherwise, compute the day before the first day of the given month
      Returns:
      the Julian day number of the day before the first day of the given month and year
    • handleGetExtendedYear

      protected int handleGetExtendedYear()
      Description copied from class: Calendar
      Returns the extended year defined by the current fields. This will use the EXTENDED_YEAR field or the YEAR and supra-year fields (such as ERA) specific to the calendar system, depending on which set of fields is newer.
      Specified by:
      handleGetExtendedYear in class Calendar
      Returns:
      the extended year
    • handleComputeFields

      protected void handleComputeFields(int julianDay)
      Override Calendar to compute several fields specific to the Islamic calendar system. These are:
      • ERA
      • YEAR
      • MONTH
      • DAY_OF_MONTH
      • DAY_OF_YEAR
      • EXTENDED_YEAR
      The DAY_OF_WEEK and DOW_LOCAL fields are already set when this method is called. The getGregorianXxx() methods return Gregorian calendar equivalents for the given Julian day.
      Overrides:
      handleComputeFields in class Calendar
    • setCalculationType

      public void setCalculationType(IslamicCalendar.CalculationType type)
      sets the calculation type for this calendar.
    • getCalculationType

      public IslamicCalendar.CalculationType getCalculationType()
      gets the calculation type for this calendar.
    • setCalcTypeForLocale

      private void setCalcTypeForLocale(ULocale locale)
      set type based on locale
    • getType

      public String getType()
      Returns the calendar type name string for this Calendar object. The returned string is the legacy ICU calendar attribute value, for example, "gregorian" or "japanese".

      See type="old type name" for the calendar attribute of locale IDs at http://www.unicode.org/reports/tr35/#Key_Type_Definitions

      Overrides:
      getType in class Calendar
      Returns:
      legacy calendar type name string
    • readObject

      private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
      Throws:
      IOException
      ClassNotFoundException
    • inTemporalLeapYear

      public boolean inTemporalLeapYear()
      Returns true if the date is in a leap year. Recalculate the current time field values if the time value has been changed by a call to setTime(). This method is semantically const, but may alter the object in memory. A "leap year" is a year that contains more days than other years (for solar or lunar calendars) or more months than other years (for lunisolar calendars like Hebrew or Chinese), as defined in the ECMAScript Temporal proposal.
      Overrides:
      inTemporalLeapYear in class Calendar
      Returns:
      true if the date in the fields is in a Temporal proposal defined leap year. False otherwise.