Class HijrahDate
- java.lang.Object
-
- 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
ChronoLocalDatefor theHijrah 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:1The 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_YEARSHolding the adjusted days in the 30 year cycle.private static java.lang.Long[]ADJUSTED_CYCLESHolding the adjusted cycle in the 1 - 30000 year.private static java.lang.Integer[]ADJUSTED_LEAST_MAX_VALUESHolding the adjusted max least max values.private static java.lang.Integer[]ADJUSTED_MAX_VALUESHolding adjusted max values.private static java.lang.Integer[]ADJUSTED_MIN_VALUESHolding the adjusted min values.private static java.util.HashMap<java.lang.Integer,java.lang.Integer[]>ADJUSTED_MONTH_DAYSHolding the adjusted month days in year.private static java.util.HashMap<java.lang.Integer,java.lang.Integer[]>ADJUSTED_MONTH_LENGTHSHolding the adjusted month length in year.private static int[]CYCLEYEAR_START_DATEZero-based start date of cycle year.private intdayOfMonthThe day-of-month.private DayOfWeekdayOfWeekThe day-of-week.private intdayOfYearThe day-of-year.private static java.lang.StringDEFAULT_CONFIG_FILENAMEDefault config file name.private static java.lang.StringDEFAULT_CONFIG_PATHDefault path to the config file.private static java.lang.Integer[]DEFAULT_CYCLE_YEARSHolding the non-adjusted 30 year cycle starting day.private static java.lang.Integer[]DEFAULT_LEAP_MONTH_DAYSHolding the non-adjusted month days in year for leap year.private static java.lang.Integer[]DEFAULT_LEAP_MONTH_LENGTHSHolding the non-adjusted month length for leap year.private static java.lang.Integer[]DEFAULT_MONTH_DAYSHolding the non-adjusted month days in year for non leap year.private static java.lang.Integer[]DEFAULT_MONTH_LENGTHSHolding the non-adjusted month length for non leap year.private HijrahEraeraThe era.private static charFILE_SEPFile separator.private longgregorianEpochDayGregorian days for this object.private static intHIJRAH_JAN_1_1_GREGORIAN_DAYNumber of Gregorian day of July 19, year 622 (Gregorian), which is epoch day of Hijrah calendar.private booleanisLeapYearTrue if year is leap year.private static int[]LEAP_MONTH_LENGTH0-based, for day-of-month in leap year.private static int[]LEAP_NUM_DAYS0-based, for number of day-of-year in the beginning of month in leap year.private static int[]LEAST_MAX_VALUESLeast maximum values.private static intMAX_ADJUSTED_CYCLEnumber of 30-year cycles to hold the deviation data.static intMAX_VALUE_OF_ERAThe maximum valid year-of-era.private static int[]MAX_VALUESMaximum values.static intMIN_VALUE_OF_ERAThe minimum valid year-of-era.private static int[]MIN_VALUESGreatest 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 355private static int[]MONTH_LENGTH0-based, for day-of-month in normal year.private intmonthOfYearThe month-of-year.private static int[]NUM_DAYS0-based, for number of day-of-year in the beginning of month in normal year.private static java.lang.StringPATH_SEPPath separator.private static intPOSITION_DAY_OF_MONTHPosition of day-of-month.private static intPOSITION_DAY_OF_YEARPosition of day-of-year.private static longserialVersionUIDSerialization version.private intyearOfEraThe year.
-
Constructor Summary
Constructors Modifier Constructor Description privateHijrahDate(long gregorianDay)Constructs an instance with the specified date.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static voidaddDeviationAsHijrah(int startYear, int startMonth, int endYear, int endMonth, int offset)Adds deviation definition.ChronoLocalDateTime<HijrahDate>atTime(LocalTime localTime)Combines this date with a time to create aChronoLocalDateTime.private static voidcheckValidDayOfMonth(int dayOfMonth)private static voidcheckValidDayOfYear(int dayOfYear)private static voidcheckValidMonth(int month)private static voidcheckValidYearOfEra(int yearOfEra)Check the validity of a yearOfEra.static HijrahDatefrom(TemporalAccessor temporal)Obtains aHijrahDateof the Islamic Umm Al-Qura calendar from a temporal object.private static java.lang.Integer[]getAdjustedCycle(int cycleNumber)Returns adjusted 30 year cycle startind day as Integer array from the cycle number specified.private static java.lang.Integer[]getAdjustedMonthDays(int year)Returns adjusted month days as Integer array form the year specified.private static java.lang.Integer[]getAdjustedMonthLength(int year)Returns adjusted month length as Integer array form the year specified.HijrahChronologygetChronology()Gets the chronology of this date.private static java.io.InputStreamgetConfigFileInputStream()Return InputStream for deviation configuration file.private static intgetCycleNumber(long epochDay)Returns the 30 year cycle number from the epoch day.private static intgetDayOfCycle(long epochDay, int cycleNumber)Returns day of cycle from the epoch day and cycle number.private static intgetDayOfMonth(int dayOfYear, int month, int year)Returns day-of-month.private static intgetDayOfYear(int cycleNumber, int dayOfCycle, int yearInCycle)Returns day-of-year.HijrahEragetEra()Gets the era, as defined by the chronology.private static longgetGregorianEpochDay(int prolepticYear, int monthOfYear, int dayOfMonth)Return Gregorian epoch day from Hijrah year, month, and day.private static int[]getHijrahDateInfo(long gregorianDays)Returns the int array containing the following field from the julian day.longgetLong(TemporalField field)Gets the value of the specified field as along.(package private) static intgetMaximumDayOfMonth()Returns maximum day-of-month.(package private) static intgetMaximumDayOfYear()Returns maximum day-of-year.private static intgetMonthDays(int month, int year)Returns month days from the beginning of year.(package private) static intgetMonthLength(int month, int year)Returns month length.private static intgetMonthOfYear(int dayOfYear, int year)Returns month-of-year.(package private) static intgetSmallestMaximumDayOfMonth()Returns smallest maximum day-of-month.(package private) static intgetSmallestMaximumDayOfYear()Returns smallest maximum day-of-year.private static intgetYearInCycle(int cycleNumber, long dayOfCycle)Returns the year in cycle from the cycle number and day of cycle.(package private) static intgetYearLength(int year)Returns year length.booleanisLeapYear()Checks if the year is a leap year, according to the Hijrah calendar system rules.(package private) static booleanisLeapYear(long year)Determines if the given year is a leap year.intlengthOfMonth()Returns the length of the month represented by this date, as defined by the calendar system.intlengthOfYear()Returns the length of the year represented by this date, as defined by the calendar system.HijrahDateminus(long amountToAdd, TemporalUnit unit)Returns an object of the same type as this object with the specified period subtracted.HijrahDateminus(TemporalAmount amount)Returns an object of the same type as this object with an amount subtracted.static HijrahDatenow()Obtains the currentHijrahDateof the Islamic Umm Al-Qura calendar in the default time-zone.static HijrahDatenow(Clock clock)Obtains the currentHijrahDateof the Islamic Umm Al-Qura calendar from the specified clock.static HijrahDatenow(ZoneId zone)Obtains the currentHijrahDateof the Islamic Umm Al-Qura calendar in the specified time-zone.static HijrahDateof(int prolepticYear, int monthOfYear, int dayOfMonth)Obtains an instance ofHijrahDatefrom the Hijrah era year, month-of-year and day-of-month.(package private) static HijrahDateof(HijrahEra era, int yearOfEra, int monthOfYear, int dayOfMonth)Obtains an instance ofHijrahDatefrom the era, year-of-era month-of-year and day-of-month.(package private) static HijrahDateof(LocalDate date)Obtains an instance ofHijrahDatefrom a date.(package private) static HijrahDateofEpochDay(long epochDay)private static voidparseLine(java.lang.String line, int num)Parse each deviation element.HijrahDateplus(long amountToAdd, TemporalUnit unit)Returns an object of the same type as this object with the specified period added.HijrahDateplus(TemporalAmount amount)Returns an object of the same type as this object with an amount added.(package private) HijrahDateplusDays(long days)Returns a copy of this date with the specified number of days added.(package private) HijrahDateplusMonths(long months)Returns a copy of this date with the specified period in months added.(package private) HijrahDateplusYears(long years)Returns a copy of this date with the specified period in years added.ValueRangerange(TemporalField field)Gets the range of valid values for the specified field.private static voidreadDeviationConfig()Read hijrah_deviation.cfg file.(package private) static ChronoLocalDatereadExternal(java.io.DataInput in)private java.lang.ObjectreadResolve()Replaces the date instance from the stream with a valid one.private static HijrahDateresolvePreviousValid(int yearOfEra, int month, int day)longtoEpochDay()Converts this date to the Epoch Day.HijrahDatewith(TemporalAdjuster adjuster)Returns an adjusted object of the same type as this object with the adjustment made.HijrahDatewith(TemporalField field, long newValue)Returns an object of the same type as this object with the specified field altered.(package private) voidwriteExternal(java.io.DataOutput out)private java.lang.ObjectwriteReplace()private static longyearToGregorianEpochDay(int prolepticYear)Returns the Gregorian epoch day from the proleptic year-
Methods inherited from class org.threeten.bp.chrono.ChronoDateImpl
minusDays, minusMonths, minusWeeks, minusYears, plusWeeks, until, until
-
Methods inherited from class org.threeten.bp.chrono.ChronoLocalDate
adjustInto, compareTo, equals, format, hashCode, isAfter, isBefore, isEqual, isSupported, isSupported, query, timeLineOrder, toString
-
Methods inherited from class org.threeten.bp.jdk8.DefaultInterfaceTemporalAccessor
get
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.threeten.bp.temporal.Temporal
isSupported
-
Methods inherited from interface org.threeten.bp.temporal.TemporalAccessor
get, isSupported, query
-
Methods inherited from interface org.threeten.bp.temporal.TemporalAdjuster
adjustInto
-
-
-
-
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 355Minimum 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.
-
-
Method Detail
-
now
public static HijrahDate now()
Obtains the currentHijrahDateof the Islamic Umm Al-Qura calendar in the default time-zone.This will query the
system clockin 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 currentHijrahDateof the Islamic Umm Al-Qura calendar in the specified time-zone.This will query the
system clockto 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 currentHijrahDateof 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 ofHijrahDatefrom 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 HijrahmonthOfYear- the month-of-year to represent, from 1 to 12dayOfMonth- 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 rangeInvalidCalendarFieldException- 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 ofHijrahDatefrom the era, year-of-era month-of-year and day-of-month.- Parameters:
era- the era to represent, not nullyearOfEra- the year-of-era to represent, from 1 to 9999monthOfYear- the month-of-year to represent, from 1 to 12dayOfMonth- 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 rangeInvalidCalendarFieldException- 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 ofHijrahDatefrom 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 aHijrahDateof 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
TemporalAccessorrepresents an arbitrary set of date and time information, which this factory converts to an instance ofHijrahDate.The conversion typically uses the
EPOCH_DAYfield, which is standardized across calendar systems.This method matches the signature of the functional interface
TemporalQueryallowing 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 aHijrahDate
-
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:ChronoLocalDateGets the chronology of this date.The
Chronologyrepresents the calendar system in use. The era and other fields inChronoFieldare defined by the chronology.- Specified by:
getChronologyin classChronoLocalDate- Returns:
- the chronology, not null
-
getEra
public HijrahEra getEra()
Description copied from class:ChronoLocalDateGets 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
Eraclasses are singletons, thus it is valid code to writedate.getEra() == SomeEra.NAME).- Overrides:
getErain classChronoLocalDate- Returns:
- the chronology specific era constant applicable at this date, not null
-
range
public ValueRange range(TemporalField field)
Description copied from interface:TemporalAccessorGets the range of valid values for the specified field.All fields can be expressed as a
longinteger. 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 inChronoField. If the field is supported, then the range of the field must be returned. If unsupported, then aDateTimeExceptionmust be thrown.If the field is not a
ChronoField, then the result of this method is obtained by invokingTemporalField.rangeRefinedBy(TemporalAccessorl)passingthisas the argument.Implementations must not alter either this object.
- Specified by:
rangein interfaceTemporalAccessor- Overrides:
rangein classDefaultInterfaceTemporalAccessor- 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:TemporalAccessorGets the value of the specified field as along.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 inChronoField. If the field is supported, then the value of the field must be returned. If unsupported, then aDateTimeExceptionmust be thrown.If the field is not a
ChronoField, then the result of this method is obtained by invokingTemporalField.getFrom(TemporalAccessor)passingthisas the argument.Implementations must not alter either this object.
- Specified by:
getLongin interfaceTemporalAccessor- Parameters:
field- the field to get, not null- Returns:
- the value for the field
-
with
public HijrahDate with(TemporalAdjuster adjuster)
Description copied from interface:TemporalReturns 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:
within interfaceTemporal- Overrides:
within classChronoLocalDate- 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:TemporalReturns 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 inChronoField. If the field is supported, then the adjustment must be performed. If unsupported, then aDateTimeExceptionmust be thrown.If the field is not a
ChronoField, then the result of this method is obtained by invokingTemporalField.adjustInto(Temporal, long)passingthisas 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:
within interfaceTemporal- Specified by:
within classChronoLocalDate- Parameters:
field- the field to set in the result, not nullnewValue- 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:TemporalReturns 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
Periodbut may be any other type implementing theTemporalAmountinterface, such asDuration.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
plusfollowed byminusis 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:
plusin interfaceTemporal- Overrides:
plusin classChronoLocalDate- 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:TemporalReturns 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,LocalTimemust acceptDAYSbut notWEEKSorMONTHS.Specification for implementors
Implementations must check and handle all units defined inChronoUnit. If the unit is supported, then the addition must be performed. If unsupported, then aDateTimeExceptionmust be thrown.If the unit is not a
ChronoUnit, then the result of this method is obtained by invokingTemporalUnit.addTo(Temporal, long)passingthisas 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:
plusin interfaceTemporal- Overrides:
plusin classChronoDateImpl<HijrahDate>- Parameters:
amountToAdd- the amount of the specified unit to add, may be negativeunit- 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:TemporalReturns 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
Periodbut may be any other type implementing theTemporalAmountinterface, such asDuration.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
plusfollowed byminusis 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:
minusin interfaceTemporal- Overrides:
minusin classChronoLocalDate- 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:TemporalReturns 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,LocalTimemust acceptDAYSbut notWEEKSorMONTHS.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:
minusin interfaceTemporal- Overrides:
minusin classChronoLocalDate- Parameters:
amountToAdd- the amount of the specified unit to subtract, may be negativeunit- 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:ChronoLocalDateCombines this date with a time to create aChronoLocalDateTime.This returns a
ChronoLocalDateTimeformed from this date at the specified time. All possible combinations of date and time are valid.- Overrides:
atTimein classChronoDateImpl<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:ChronoLocalDateConverts this date to the Epoch Day.The
Epoch Day countis 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:
toEpochDayin classChronoLocalDate- 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:
isLeapYearin classChronoLocalDate- Returns:
- true if this date is in a leap year
-
plusYears
HijrahDate plusYears(long years)
Description copied from class:ChronoDateImplReturns 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:
plusYearsin classChronoDateImpl<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:ChronoDateImplReturns 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:
plusMonthsin classChronoDateImpl<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:ChronoDateImplReturns 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:
plusDaysin classChronoDateImpl<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 calculatedmonthOfYear- the month-of-year to represent, caller calculateddayOfMonth- 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 daycycleNumber- 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 numberdayOfCycle- 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 numberdayOfCycle- day of cycleyearInCycle- 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-yearyear- 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 yearmonth- monthyear- 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:ChronoLocalDateReturns 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:
lengthOfMonthin classChronoLocalDate- 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:ChronoLocalDateReturns 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:
lengthOfYearin classChronoLocalDate- 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 yearstartMonth- start monthendYear- end yearendMonth- end monthoffset- offset
-
readDeviationConfig
private static void readDeviationConfig() throws java.io.IOException, java.text.ParseExceptionRead 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.ParseExceptionParse each deviation element.- Parameters:
line- a line to parsenum- line number- Throws:
java.text.ParseException- if line has incorrect format.
-
getConfigFileInputStream
private static java.io.InputStream getConfigFileInputStream() throws java.io.IOExceptionReturn 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
-
-