Class HijrahDate

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Comparable<ChronoLocalDate>, Temporal, TemporalAccessor, TemporalAdjuster

    public final class HijrahDate
    extends ChronoDateImpl<HijrahDate>
    implements java.io.Serializable
    A date in the Hijrah calendar system.

    This implements ChronoLocalDate for the Hijrah calendar.

    The Hijrah calendar has a different total of days in a year than Gregorian calendar, and a month is based on the period of a complete revolution of the moon around the earth (as between successive new moons). The calendar cycles becomes longer and unstable, and sometimes a manual adjustment (for entering deviation) is necessary for correctness because of the complex algorithm.

    HijrahDate supports the manual adjustment feature by providing a configuration file. The configuration file contains the adjustment (deviation) data with following format.

       StartYear/StartMonth(0-based)-EndYear/EndMonth(0-based):Deviation day (1, 2, -1, or -2)
       Line separator or ";" is used for the separator of each deviation data.
    Here is the example.
         1429/0-1429/1:1
         1429/2-1429/7:1;1429/6-1429/11:1
         1429/11-9999/11:1
    The default location of the configuration file is:
       $CLASSPATH/org/threeten/bp/chrono
    And the default file name is:
       hijrah_deviation.cfg
    The default location and file name can be overriden by setting following two Java's system property.
       Location: org.threeten.bp.i18n.HijrahDate.deviationConfigDir
       File name: org.threeten.bp.i18n.HijrahDate.deviationConfigFile

    Specification for implementors

    This class is immutable and thread-safe.
    See Also:
    Serialized Form
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_CYCLE_YEARS
      Holding the adjusted days in the 30 year cycle.
      private static java.lang.Long[] ADJUSTED_CYCLES
      Holding the adjusted cycle in the 1 - 30000 year.
      private static java.lang.Integer[] ADJUSTED_LEAST_MAX_VALUES
      Holding the adjusted max least max values.
      private static java.lang.Integer[] ADJUSTED_MAX_VALUES
      Holding adjusted max values.
      private static java.lang.Integer[] ADJUSTED_MIN_VALUES
      Holding the adjusted min values.
      private static java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_MONTH_DAYS
      Holding the adjusted month days in year.
      private static java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_MONTH_LENGTHS
      Holding the adjusted month length in year.
      private static int[] CYCLEYEAR_START_DATE
      Zero-based start date of cycle year.
      private int dayOfMonth
      The day-of-month.
      private DayOfWeek dayOfWeek
      The day-of-week.
      private int dayOfYear
      The day-of-year.
      private static java.lang.String DEFAULT_CONFIG_FILENAME
      Default config file name.
      private static java.lang.String DEFAULT_CONFIG_PATH
      Default path to the config file.
      private static java.lang.Integer[] DEFAULT_CYCLE_YEARS
      Holding the non-adjusted 30 year cycle starting day.
      private static java.lang.Integer[] DEFAULT_LEAP_MONTH_DAYS
      Holding the non-adjusted month days in year for leap year.
      private static java.lang.Integer[] DEFAULT_LEAP_MONTH_LENGTHS
      Holding the non-adjusted month length for leap year.
      private static java.lang.Integer[] DEFAULT_MONTH_DAYS
      Holding the non-adjusted month days in year for non leap year.
      private static java.lang.Integer[] DEFAULT_MONTH_LENGTHS
      Holding the non-adjusted month length for non leap year.
      private HijrahEra era
      The era.
      private static char FILE_SEP
      File separator.
      private long gregorianEpochDay
      Gregorian days for this object.
      private static int HIJRAH_JAN_1_1_GREGORIAN_DAY
      Number of Gregorian day of July 19, year 622 (Gregorian), which is epoch day of Hijrah calendar.
      private boolean isLeapYear
      True if year is leap year.
      private static int[] LEAP_MONTH_LENGTH
      0-based, for day-of-month in leap year.
      private static int[] LEAP_NUM_DAYS
      0-based, for number of day-of-year in the beginning of month in leap year.
      private static int[] LEAST_MAX_VALUES
      Least maximum values.
      private static int MAX_ADJUSTED_CYCLE
      number of 30-year cycles to hold the deviation data.
      static int MAX_VALUE_OF_ERA
      The maximum valid year-of-era.
      private static int[] MAX_VALUES
      Maximum values.
      static int MIN_VALUE_OF_ERA
      The minimum valid year-of-era.
      private static int[] MIN_VALUES
      Greatest Least Field name Minimum Minimum Maximum Maximum ---------- ------- ------- ------- ------- ERA 0 0 1 1 YEAR_OF_ERA 1 1 9999 9999 MONTH_OF_YEAR 1 1 12 12 DAY_OF_MONTH 1 1 29 30 DAY_OF_YEAR 1 1 354 355
      private static int[] MONTH_LENGTH
      0-based, for day-of-month in normal year.
      private int monthOfYear
      The month-of-year.
      private static int[] NUM_DAYS
      0-based, for number of day-of-year in the beginning of month in normal year.
      private static java.lang.String PATH_SEP
      Path separator.
      private static int POSITION_DAY_OF_MONTH
      Position of day-of-month.
      private static int POSITION_DAY_OF_YEAR
      Position of day-of-year.
      private static long serialVersionUID
      Serialization version.
      private int yearOfEra
      The year.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private HijrahDate​(long gregorianDay)
      Constructs an instance with the specified date.
    • Field Detail

      • serialVersionUID

        private static final long serialVersionUID
        Serialization version.
        See Also:
        Constant Field Values
      • MIN_VALUE_OF_ERA

        public static final int MIN_VALUE_OF_ERA
        The minimum valid year-of-era.
        See Also:
        Constant Field Values
      • MAX_VALUE_OF_ERA

        public static final int MAX_VALUE_OF_ERA
        The maximum valid year-of-era. This is currently set to 9999 but may be changed to increase the valid range in a future version of the specification.
        See Also:
        Constant Field Values
      • NUM_DAYS

        private static final int[] NUM_DAYS
        0-based, for number of day-of-year in the beginning of month in normal year.
      • LEAP_NUM_DAYS

        private static final int[] LEAP_NUM_DAYS
        0-based, for number of day-of-year in the beginning of month in leap year.
      • MONTH_LENGTH

        private static final int[] MONTH_LENGTH
        0-based, for day-of-month in normal year.
      • LEAP_MONTH_LENGTH

        private static final int[] LEAP_MONTH_LENGTH
        0-based, for day-of-month in leap year.
      • MIN_VALUES

        private static final int[] MIN_VALUES
                                    Greatest       Least
         Field name        Minimum   Minimum     Maximum     Maximum
         ----------        -------   -------     -------     -------
         ERA                     0         0           1           1
         YEAR_OF_ERA             1         1        9999        9999
         MONTH_OF_YEAR           1         1          12          12
         DAY_OF_MONTH            1         1          29          30
         DAY_OF_YEAR             1         1         354         355
         
        Minimum values.
      • LEAST_MAX_VALUES

        private static final int[] LEAST_MAX_VALUES
        Least maximum values.
      • MAX_VALUES

        private static final int[] MAX_VALUES
        Maximum values.
      • POSITION_DAY_OF_MONTH

        private static final int POSITION_DAY_OF_MONTH
        Position of day-of-month. This value is used to get the min/max value from an array.
        See Also:
        Constant Field Values
      • POSITION_DAY_OF_YEAR

        private static final int POSITION_DAY_OF_YEAR
        Position of day-of-year. This value is used to get the min/max value from an array.
        See Also:
        Constant Field Values
      • CYCLEYEAR_START_DATE

        private static final int[] CYCLEYEAR_START_DATE
        Zero-based start date of cycle year.
      • FILE_SEP

        private static final char FILE_SEP
        File separator.
      • PATH_SEP

        private static final java.lang.String PATH_SEP
        Path separator.
      • DEFAULT_CONFIG_FILENAME

        private static final java.lang.String DEFAULT_CONFIG_FILENAME
        Default config file name.
        See Also:
        Constant Field Values
      • DEFAULT_CONFIG_PATH

        private static final java.lang.String DEFAULT_CONFIG_PATH
        Default path to the config file.
      • ADJUSTED_MONTH_DAYS

        private static final java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_MONTH_DAYS
        Holding the adjusted month days in year. The key is a year (Integer) and the value is the all the month days in year (Integer[]).
      • ADJUSTED_MONTH_LENGTHS

        private static final java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_MONTH_LENGTHS
        Holding the adjusted month length in year. The key is a year (Integer) and the value is the all the month length in year (Integer[]).
      • ADJUSTED_CYCLE_YEARS

        private static final java.util.HashMap<java.lang.Integer,​java.lang.Integer[]> ADJUSTED_CYCLE_YEARS
        Holding the adjusted days in the 30 year cycle. The key is a cycle number (Integer) and the value is the all the starting days of the year in the cycle (Integer[]).
      • ADJUSTED_CYCLES

        private static final java.lang.Long[] ADJUSTED_CYCLES
        Holding the adjusted cycle in the 1 - 30000 year. The key is the cycle number (Integer) and the value is the starting days in the cycle in the term.
      • ADJUSTED_MIN_VALUES

        private static final java.lang.Integer[] ADJUSTED_MIN_VALUES
        Holding the adjusted min values.
      • ADJUSTED_LEAST_MAX_VALUES

        private static final java.lang.Integer[] ADJUSTED_LEAST_MAX_VALUES
        Holding the adjusted max least max values.
      • ADJUSTED_MAX_VALUES

        private static final java.lang.Integer[] ADJUSTED_MAX_VALUES
        Holding adjusted max values.
      • DEFAULT_MONTH_DAYS

        private static final java.lang.Integer[] DEFAULT_MONTH_DAYS
        Holding the non-adjusted month days in year for non leap year.
      • DEFAULT_LEAP_MONTH_DAYS

        private static final java.lang.Integer[] DEFAULT_LEAP_MONTH_DAYS
        Holding the non-adjusted month days in year for leap year.
      • DEFAULT_MONTH_LENGTHS

        private static final java.lang.Integer[] DEFAULT_MONTH_LENGTHS
        Holding the non-adjusted month length for non leap year.
      • DEFAULT_LEAP_MONTH_LENGTHS

        private static final java.lang.Integer[] DEFAULT_LEAP_MONTH_LENGTHS
        Holding the non-adjusted month length for leap year.
      • DEFAULT_CYCLE_YEARS

        private static final java.lang.Integer[] DEFAULT_CYCLE_YEARS
        Holding the non-adjusted 30 year cycle starting day.
      • MAX_ADJUSTED_CYCLE

        private static final int MAX_ADJUSTED_CYCLE
        number of 30-year cycles to hold the deviation data.
        See Also:
        Constant Field Values
      • HIJRAH_JAN_1_1_GREGORIAN_DAY

        private static final int HIJRAH_JAN_1_1_GREGORIAN_DAY
        Number of Gregorian day of July 19, year 622 (Gregorian), which is epoch day of Hijrah calendar.
        See Also:
        Constant Field Values
      • era

        private final transient HijrahEra era
        The era.
      • yearOfEra

        private final transient int yearOfEra
        The year.
      • monthOfYear

        private final transient int monthOfYear
        The month-of-year.
      • dayOfMonth

        private final transient int dayOfMonth
        The day-of-month.
      • dayOfYear

        private final transient int dayOfYear
        The day-of-year.
      • dayOfWeek

        private final transient DayOfWeek dayOfWeek
        The day-of-week.
      • gregorianEpochDay

        private final long gregorianEpochDay
        Gregorian days for this object. Holding number of days since 1970/01/01. The number of days are calculated with pure Gregorian calendar based.
      • isLeapYear

        private final transient boolean isLeapYear
        True if year is leap year.
    • Constructor Detail

      • HijrahDate

        private HijrahDate​(long gregorianDay)
        Constructs an instance with the specified date.
        Parameters:
        gregorianDay - the number of days from 0001/01/01 (Gregorian), caller calculated
    • Method Detail

      • now

        public static HijrahDate now()
        Obtains the current HijrahDate of the Islamic Umm Al-Qura calendar in the default time-zone.

        This will query the system clock in the default time-zone to obtain the current date.

        Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

        Returns:
        the current date using the system clock and default time-zone, not null
      • now

        public static HijrahDate now​(ZoneId zone)
        Obtains the current HijrahDate of the Islamic Umm Al-Qura calendar in the specified time-zone.

        This will query the system clock to obtain the current date. Specifying the time-zone avoids dependence on the default time-zone.

        Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

        Parameters:
        zone - the zone ID to use, not null
        Returns:
        the current date using the system clock, not null
      • now

        public static HijrahDate now​(Clock clock)
        Obtains the current HijrahDate of the Islamic Umm Al-Qura calendar from the specified clock.

        This will query the specified clock to obtain the current date - today. Using this method allows the use of an alternate clock for testing. The alternate clock may be introduced using dependency injection.

        Parameters:
        clock - the clock to use, not null
        Returns:
        the current date, not null
        Throws:
        DateTimeException - if the current date cannot be obtained
      • of

        public static HijrahDate of​(int prolepticYear,
                                    int monthOfYear,
                                    int dayOfMonth)
        Obtains an instance of HijrahDate from the Hijrah era year, month-of-year and day-of-month. This uses the Hijrah era.
        Parameters:
        prolepticYear - the proleptic year to represent in the Hijrah
        monthOfYear - the month-of-year to represent, from 1 to 12
        dayOfMonth - the day-of-month to represent, from 1 to 30
        Returns:
        the Hijrah date, never null
        Throws:
        IllegalCalendarFieldValueException - if the value of any field is out of range
        InvalidCalendarFieldException - if the day-of-month is invalid for the month-year
      • of

        static HijrahDate of​(HijrahEra era,
                             int yearOfEra,
                             int monthOfYear,
                             int dayOfMonth)
        Obtains an instance of HijrahDate from the era, year-of-era month-of-year and day-of-month.
        Parameters:
        era - the era to represent, not null
        yearOfEra - the year-of-era to represent, from 1 to 9999
        monthOfYear - the month-of-year to represent, from 1 to 12
        dayOfMonth - the day-of-month to represent, from 1 to 31
        Returns:
        the Hijrah date, never null
        Throws:
        IllegalCalendarFieldValueException - if the value of any field is out of range
        InvalidCalendarFieldException - if the day-of-month is invalid for the month-year
      • checkValidYearOfEra

        private static void checkValidYearOfEra​(int yearOfEra)
        Check the validity of a yearOfEra.
        Parameters:
        yearOfEra - the year to check
      • checkValidDayOfYear

        private static void checkValidDayOfYear​(int dayOfYear)
      • checkValidMonth

        private static void checkValidMonth​(int month)
      • checkValidDayOfMonth

        private static void checkValidDayOfMonth​(int dayOfMonth)
      • of

        static HijrahDate of​(LocalDate date)
        Obtains an instance of HijrahDate from a date.
        Parameters:
        date - the date to use, not null
        Returns:
        the Hijrah date, never null
        Throws:
        IllegalCalendarFieldValueException - if the year is invalid
      • ofEpochDay

        static HijrahDate ofEpochDay​(long epochDay)
      • from

        public static HijrahDate from​(TemporalAccessor temporal)
        Obtains a HijrahDate of the Islamic Umm Al-Qura calendar from a temporal object.

        This obtains a date in the Hijrah calendar system based on the specified temporal. A TemporalAccessor represents an arbitrary set of date and time information, which this factory converts to an instance of HijrahDate.

        The conversion typically uses the EPOCH_DAY field, which is standardized across calendar systems.

        This method matches the signature of the functional interface TemporalQuery allowing it to be used as a query via method reference, HijrahDate::from.

        Parameters:
        temporal - the temporal object to convert, not null
        Returns:
        the date in Hijrah calendar system, not null
        Throws:
        DateTimeException - if unable to convert to a HijrahDate
      • readResolve

        private java.lang.Object readResolve()
        Replaces the date instance from the stream with a valid one.
        Returns:
        the resolved date, never null
      • getChronology

        public HijrahChronology getChronology()
        Description copied from class: ChronoLocalDate
        Gets the chronology of this date.

        The Chronology represents the calendar system in use. The era and other fields in ChronoField are defined by the chronology.

        Specified by:
        getChronology in class ChronoLocalDate
        Returns:
        the chronology, not null
      • getEra

        public HijrahEra getEra()
        Description copied from class: ChronoLocalDate
        Gets the era, as defined by the chronology.

        The era is, conceptually, the largest division of the time-line. Most calendar systems have a single epoch dividing the time-line into two eras. However, some have multiple eras, such as one for the reign of each leader. The exact meaning is determined by the Chronology.

        All correctly implemented Era classes are singletons, thus it is valid code to write date.getEra() == SomeEra.NAME).

        Overrides:
        getEra in class ChronoLocalDate
        Returns:
        the chronology specific era constant applicable at this date, not null
      • range

        public ValueRange range​(TemporalField field)
        Description copied from interface: TemporalAccessor
        Gets the range of valid values for the specified field.

        All fields can be expressed as a long integer. This method returns an object that describes the valid range for that value. The value of this temporal object is used to enhance the accuracy of the returned range. If the date-time cannot return the range, because the field is unsupported or for some other reason, an exception will be thrown.

        Note that the result only describes the minimum and maximum valid values and it is important not to read too much into them. For example, there could be values within the range that are invalid for the field.

        Specification for implementors

        Implementations must check and handle all fields defined in ChronoField. If the field is supported, then the range of the field must be returned. If unsupported, then a DateTimeException must be thrown.

        If the field is not a ChronoField, then the result of this method is obtained by invoking TemporalField.rangeRefinedBy(TemporalAccessorl) passing this as the argument.

        Implementations must not alter either this object.

        Specified by:
        range in interface TemporalAccessor
        Overrides:
        range in class DefaultInterfaceTemporalAccessor
        Parameters:
        field - the field to query the range for, not null
        Returns:
        the range of valid values for the field, not null
      • getLong

        public long getLong​(TemporalField field)
        Description copied from interface: TemporalAccessor
        Gets the value of the specified field as a long.

        This queries the date-time for the value for the specified field. The returned value may be outside the valid range of values for the field. If the date-time cannot return the value, because the field is unsupported or for some other reason, an exception will be thrown.

        Specification for implementors

        Implementations must check and handle all fields defined in ChronoField. If the field is supported, then the value of the field must be returned. If unsupported, then a DateTimeException must be thrown.

        If the field is not a ChronoField, then the result of this method is obtained by invoking TemporalField.getFrom(TemporalAccessor) passing this as the argument.

        Implementations must not alter either this object.

        Specified by:
        getLong in interface TemporalAccessor
        Parameters:
        field - the field to get, not null
        Returns:
        the value for the field
      • with

        public HijrahDate with​(TemporalAdjuster adjuster)
        Description copied from interface: Temporal
        Returns an adjusted object of the same type as this object with the adjustment made.

        This adjusts this date-time according to the rules of the specified adjuster. A simple adjuster might simply set the one of the fields, such as the year field. A more complex adjuster might set the date to the last day of the month. A selection of common adjustments is provided in TemporalAdjusters. These include finding the "last day of the month" and "next Wednesday". The adjuster is responsible for handling special cases, such as the varying lengths of month and leap years.

        Some example code indicating how and why this method is used:

          date = date.with(Month.JULY);        // most key classes implement TemporalAdjuster
          date = date.with(lastDayOfMonth());  // static import from TemporalAdjusters
          date = date.with(next(WEDNESDAY));   // static import from TemporalAdjusters and DayOfWeek
         

        Specification for implementors

        Implementations must not alter either this object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
        Specified by:
        with in interface Temporal
        Overrides:
        with in class ChronoLocalDate
        Parameters:
        adjuster - the adjuster to use, not null
        Returns:
        an object of the same type with the specified adjustment made, not null
      • with

        public HijrahDate with​(TemporalField field,
                               long newValue)
        Description copied from interface: Temporal
        Returns an object of the same type as this object with the specified field altered.

        This returns a new object based on this one with the value for the specified field changed. For example, on a LocalDate, this could be used to set the year, month or day-of-month. The returned object will have the same observable type as this object.

        In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st January, then changing the month to February would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.

        Specification for implementors

        Implementations must check and handle all fields defined in ChronoField. If the field is supported, then the adjustment must be performed. If unsupported, then a DateTimeException must be thrown.

        If the field is not a ChronoField, then the result of this method is obtained by invoking TemporalField.adjustInto(Temporal, long) passing this as the first argument.

        Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.

        Specified by:
        with in interface Temporal
        Specified by:
        with in class ChronoLocalDate
        Parameters:
        field - the field to set in the result, not null
        newValue - the new value of the field in the result
        Returns:
        an object of the same type with the specified field set, not null
      • resolvePreviousValid

        private static HijrahDate resolvePreviousValid​(int yearOfEra,
                                                       int month,
                                                       int day)
      • plus

        public HijrahDate plus​(TemporalAmount amount)
        Description copied from interface: Temporal
        Returns an object of the same type as this object with an amount added.

        This adjusts this temporal, adding according to the rules of the specified amount. The amount is typically a Period but may be any other type implementing the TemporalAmount interface, such as Duration.

        Some example code indicating how and why this method is used:

          date = date.plus(period);                  // add a Period instance
          date = date.plus(duration);                // add a Duration instance
          date = date.plus(workingDays(6));          // example user-written workingDays method
         

        Note that calling plus followed by minus is not guaranteed to return the same date-time.

        Specification for implementors

        Implementations must not alter either this object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
        Specified by:
        plus in interface Temporal
        Overrides:
        plus in class ChronoLocalDate
        Parameters:
        amount - the amount to add, not null
        Returns:
        an object of the same type with the specified adjustment made, not null
      • plus

        public HijrahDate plus​(long amountToAdd,
                               TemporalUnit unit)
        Description copied from interface: Temporal
        Returns an object of the same type as this object with the specified period added.

        This method returns a new object based on this one with the specified period added. For example, on a LocalDate, this could be used to add a number of years, months or days. The returned object will have the same observable type as this object.

        In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st January, then adding one month would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.

        If the implementation represents a date-time that has boundaries, such as LocalTime, then the permitted units must include the boundary unit, but no multiples of the boundary unit. For example, LocalTime must accept DAYS but not WEEKS or MONTHS.

        Specification for implementors

        Implementations must check and handle all units defined in ChronoUnit. If the unit is supported, then the addition must be performed. If unsupported, then a DateTimeException must be thrown.

        If the unit is not a ChronoUnit, then the result of this method is obtained by invoking TemporalUnit.addTo(Temporal, long) passing this as the first argument.

        Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.

        Specified by:
        plus in interface Temporal
        Overrides:
        plus in class ChronoDateImpl<HijrahDate>
        Parameters:
        amountToAdd - the amount of the specified unit to add, may be negative
        unit - the unit of the period to add, not null
        Returns:
        an object of the same type with the specified period added, not null
      • minus

        public HijrahDate minus​(TemporalAmount amount)
        Description copied from interface: Temporal
        Returns an object of the same type as this object with an amount subtracted.

        This adjusts this temporal, subtracting according to the rules of the specified amount. The amount is typically a Period but may be any other type implementing the TemporalAmount interface, such as Duration.

        Some example code indicating how and why this method is used:

          date = date.minus(period);                  // subtract a Period instance
          date = date.minus(duration);                // subtract a Duration instance
          date = date.minus(workingDays(6));          // example user-written workingDays method
         

        Note that calling plus followed by minus is not guaranteed to return the same date-time.

        Specification for implementors

        Implementations must not alter either this object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
        Specified by:
        minus in interface Temporal
        Overrides:
        minus in class ChronoLocalDate
        Parameters:
        amount - the amount to subtract, not null
        Returns:
        an object of the same type with the specified adjustment made, not null
      • minus

        public HijrahDate minus​(long amountToAdd,
                                TemporalUnit unit)
        Description copied from interface: Temporal
        Returns an object of the same type as this object with the specified period subtracted.

        This method returns a new object based on this one with the specified period subtracted. For example, on a LocalDate, this could be used to subtract a number of years, months or days. The returned object will have the same observable type as this object.

        In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st March, then subtracting one month would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.

        If the implementation represents a date-time that has boundaries, such as LocalTime, then the permitted units must include the boundary unit, but no multiples of the boundary unit. For example, LocalTime must accept DAYS but not WEEKS or MONTHS.

        Specification for implementors

        Implementations must behave in a manor equivalent to the default method behavior.

        Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.

        Specified by:
        minus in interface Temporal
        Overrides:
        minus in class ChronoLocalDate
        Parameters:
        amountToAdd - the amount of the specified unit to subtract, may be negative
        unit - the unit of the period to subtract, not null
        Returns:
        an object of the same type with the specified period subtracted, not null
      • atTime

        public final ChronoLocalDateTime<HijrahDate> atTime​(LocalTime localTime)
        Description copied from class: ChronoLocalDate
        Combines this date with a time to create a ChronoLocalDateTime.

        This returns a ChronoLocalDateTime formed from this date at the specified time. All possible combinations of date and time are valid.

        Overrides:
        atTime in class ChronoDateImpl<HijrahDate>
        Parameters:
        localTime - the local time to use, not null
        Returns:
        the local date-time formed from this date and the specified time, not null
      • toEpochDay

        public long toEpochDay()
        Description copied from class: ChronoLocalDate
        Converts this date to the Epoch Day.

        The Epoch Day count is a simple incrementing count of days where day 0 is 1970-01-01 (ISO). This definition is the same for all chronologies, enabling conversion.

        Overrides:
        toEpochDay in class ChronoLocalDate
        Returns:
        the Epoch Day equivalent to this date
      • isLeapYear

        public boolean isLeapYear()
        Checks if the year is a leap year, according to the Hijrah calendar system rules.
        Overrides:
        isLeapYear in class ChronoLocalDate
        Returns:
        true if this date is in a leap year
      • plusYears

        HijrahDate plusYears​(long years)
        Description copied from class: ChronoDateImpl
        Returns a copy of this date with the specified period in years added.

        This adds the specified period in years to the date. In some cases, adding years can cause the resulting date to become invalid. If this occurs, then other fields, typically the day-of-month, will be adjusted to ensure that the result is valid. Typically this will select the last valid day of the month.

        This instance is immutable and unaffected by this method call.

        Specified by:
        plusYears in class ChronoDateImpl<HijrahDate>
        Parameters:
        years - the years to add, may be negative
        Returns:
        a date based on this one with the years added, not null
      • plusMonths

        HijrahDate plusMonths​(long months)
        Description copied from class: ChronoDateImpl
        Returns a copy of this date with the specified period in months added.

        This adds the specified period in months to the date. In some cases, adding months can cause the resulting date to become invalid. If this occurs, then other fields, typically the day-of-month, will be adjusted to ensure that the result is valid. Typically this will select the last valid day of the month.

        This instance is immutable and unaffected by this method call.

        Specified by:
        plusMonths in class ChronoDateImpl<HijrahDate>
        Parameters:
        months - the months to add, may be negative
        Returns:
        a date based on this one with the months added, not null
      • plusDays

        HijrahDate plusDays​(long days)
        Description copied from class: ChronoDateImpl
        Returns a copy of this date with the specified number of days added.

        This adds the specified period in days to the date.

        This instance is immutable and unaffected by this method call.

        Specified by:
        plusDays in class ChronoDateImpl<HijrahDate>
        Parameters:
        days - the days to add, may be negative
        Returns:
        a date based on this one with the days added, not null
      • getHijrahDateInfo

        private static int[] getHijrahDateInfo​(long gregorianDays)
        Returns the int array containing the following field from the julian day. int[0] = ERA int[1] = YEAR int[2] = MONTH int[3] = DATE int[4] = DAY_OF_YEAR int[5] = DAY_OF_WEEK
        Parameters:
        julianDay - a julian day.
      • getGregorianEpochDay

        private static long getGregorianEpochDay​(int prolepticYear,
                                                 int monthOfYear,
                                                 int dayOfMonth)
        Return Gregorian epoch day from Hijrah year, month, and day.
        Parameters:
        prolepticYear - the year to represent, caller calculated
        monthOfYear - the month-of-year to represent, caller calculated
        dayOfMonth - the day-of-month to represent, caller calculated
        Returns:
        a julian day
      • yearToGregorianEpochDay

        private static long yearToGregorianEpochDay​(int prolepticYear)
        Returns the Gregorian epoch day from the proleptic year
        Parameters:
        prolepticYear - the proleptic year
        Returns:
        the Epoch day
      • getCycleNumber

        private static int getCycleNumber​(long epochDay)
        Returns the 30 year cycle number from the epoch day.
        Parameters:
        epochDay - an epoch day
        Returns:
        a cycle number
      • getDayOfCycle

        private static int getDayOfCycle​(long epochDay,
                                         int cycleNumber)
        Returns day of cycle from the epoch day and cycle number.
        Parameters:
        epochDay - an epoch day
        cycleNumber - a cycle number
        Returns:
        a day of cycle
      • getYearInCycle

        private static int getYearInCycle​(int cycleNumber,
                                          long dayOfCycle)
        Returns the year in cycle from the cycle number and day of cycle.
        Parameters:
        cycleNumber - a cycle number
        dayOfCycle - day of cycle
        Returns:
        a year in cycle
      • getAdjustedCycle

        private static java.lang.Integer[] getAdjustedCycle​(int cycleNumber)
        Returns adjusted 30 year cycle startind day as Integer array from the cycle number specified.
        Parameters:
        cycleNumber - a cycle number
        Returns:
        an Integer array
      • getAdjustedMonthDays

        private static java.lang.Integer[] getAdjustedMonthDays​(int year)
        Returns adjusted month days as Integer array form the year specified.
        Parameters:
        year - a year
        Returns:
        an Integer array
      • getAdjustedMonthLength

        private static java.lang.Integer[] getAdjustedMonthLength​(int year)
        Returns adjusted month length as Integer array form the year specified.
        Parameters:
        year - a year
        Returns:
        an Integer array
      • getDayOfYear

        private static int getDayOfYear​(int cycleNumber,
                                        int dayOfCycle,
                                        int yearInCycle)
        Returns day-of-year.
        Parameters:
        cycleNumber - a cycle number
        dayOfCycle - day of cycle
        yearInCycle - year in cycle
        Returns:
        day-of-year
      • getMonthOfYear

        private static int getMonthOfYear​(int dayOfYear,
                                          int year)
        Returns month-of-year. 0-based.
        Parameters:
        dayOfYear - day-of-year
        year - a year
        Returns:
        month-of-year
      • getDayOfMonth

        private static int getDayOfMonth​(int dayOfYear,
                                         int month,
                                         int year)
        Returns day-of-month.
        Parameters:
        dayOfYear - day of year
        month - month
        year - year
        Returns:
        day-of-month
      • isLeapYear

        static boolean isLeapYear​(long year)
        Determines if the given year is a leap year.
        Parameters:
        year - year
        Returns:
        true if leap year
      • getMonthDays

        private static int getMonthDays​(int month,
                                        int year)
        Returns month days from the beginning of year.
        Parameters:
        month - month (0-based)
        Returns:
        month days from the beginning of year
      • getMonthLength

        static int getMonthLength​(int month,
                                  int year)
        Returns month length.
        Parameters:
        month - month (0-based)
        year - year
        Returns:
        month length
      • lengthOfMonth

        public int lengthOfMonth()
        Description copied from class: ChronoLocalDate
        Returns the length of the month represented by this date, as defined by the calendar system.

        This returns the length of the month in days.

        Specified by:
        lengthOfMonth in class ChronoLocalDate
        Returns:
        the length of the month in days
      • getYearLength

        static int getYearLength​(int year)
        Returns year length.
        Parameters:
        year - year
        Returns:
        year length
      • lengthOfYear

        public int lengthOfYear()
        Description copied from class: ChronoLocalDate
        Returns the length of the year represented by this date, as defined by the calendar system.

        This returns the length of the year in days.

        The default implementation uses ChronoLocalDate.isLeapYear() and returns 365 or 366.

        Overrides:
        lengthOfYear in class ChronoLocalDate
        Returns:
        the length of the year in days
      • getMaximumDayOfMonth

        static int getMaximumDayOfMonth()
        Returns maximum day-of-month.
        Returns:
        maximum day-of-month
      • getSmallestMaximumDayOfMonth

        static int getSmallestMaximumDayOfMonth()
        Returns smallest maximum day-of-month.
        Returns:
        smallest maximum day-of-month
      • getMaximumDayOfYear

        static int getMaximumDayOfYear()
        Returns maximum day-of-year.
        Returns:
        maximum day-of-year
      • getSmallestMaximumDayOfYear

        static int getSmallestMaximumDayOfYear()
        Returns smallest maximum day-of-year.
        Returns:
        smallest maximum day-of-year
      • addDeviationAsHijrah

        private static void addDeviationAsHijrah​(int startYear,
                                                 int startMonth,
                                                 int endYear,
                                                 int endMonth,
                                                 int offset)
        Adds deviation definition. The year and month sepcifed should be the caluculated Hijrah year and month. The month is 0 based. e.g. 8 for Ramadan (9th month) Addition of anything minus deviation days is calculated negatively in the case the user wants to subtract days from the calendar. For example, adding -1 days will subtract one day from the current date. Please note that this behavior is different from the addDeviaiton method.
        Parameters:
        startYear - start year
        startMonth - start month
        endYear - end year
        endMonth - end month
        offset - offset
      • readDeviationConfig

        private static void readDeviationConfig()
                                         throws java.io.IOException,
                                                java.text.ParseException
        Read hijrah_deviation.cfg file. The config file contains the deviation data with following format. StartYear/StartMonth(0-based)-EndYear/EndMonth(0-based):Deviation day (1, 2, -1, or -2) Line separator or ";" is used for the separator of each deviation data. Here is the example. 1429/0-1429/1:1 1429/2-1429/7:1;1429/6-1429/11:1 1429/11-9999/11:1
        Throws:
        java.io.IOException - for zip/jar file handling exception.
        java.text.ParseException - if the format of the configuration file is wrong.
      • parseLine

        private static void parseLine​(java.lang.String line,
                                      int num)
                               throws java.text.ParseException
        Parse each deviation element.
        Parameters:
        line - a line to parse
        num - line number
        Throws:
        java.text.ParseException - if line has incorrect format.
      • getConfigFileInputStream

        private static java.io.InputStream getConfigFileInputStream()
                                                             throws java.io.IOException
        Return InputStream for deviation configuration file. The default location of the deviation file is:
           $CLASSPATH/org/threeten/bp/chrono
         
        And the default file name is:
           hijrah_deviation.cfg
         
        The default location and file name can be overriden by setting following two Java's system property.
           Location: org.threeten.bp.i18n.HijrahDate.deviationConfigDir
           File name: org.threeten.bp.i18n.HijrahDate.deviationConfigFile
         
        Regarding the file format, see readDeviationConfig() method for details.
        Returns:
        InputStream for file reading exception.
        Throws:
        java.io.IOException - for zip/jar file handling exception.
      • writeReplace

        private java.lang.Object writeReplace()
      • writeExternal

        void writeExternal​(java.io.DataOutput out)
                    throws java.io.IOException
        Throws:
        java.io.IOException
      • readExternal

        static ChronoLocalDate readExternal​(java.io.DataInput in)
                                     throws java.io.IOException
        Throws:
        java.io.IOException