Calendrical. Islamic. Rgsa
(Calendrical v0.13.0)
Copy Markdown
Implementation of the Saudi Arabian sighting-based Islamic
calendar (CLDR :islamic_rgsa).
Like Calendrical.Islamic.Observational, this calendar determines
the start of each lunar month from actual crescent visibility, but
the observation point is Mecca, Saudi Arabia (21.4225° N,
39.8262° E, 277 m) — the al-Masjid al-Ḥarām — rather than Cairo.
This matches the location used for the canonical Saudi religious
determination of dates such as the start of Ramadan and Eid.
This calendar differs from Calendrical.Islamic.UmmAlQura in two
important ways:
UmmAlQurauses the official tabular calendar published by KACST (the Umm al-Qura Calendar). It is a precomputed lookup table — fast, deterministic, and the legal Saudi civil calendar.Rgsacomputes month starts from astronomical visibility at Mecca on demand. It is the algorithmic equivalent of the Saudi religious sighting practice and may diverge fromUmmAlQurain months where the astronomical prediction does not match the KACST table.
Days are assumed to begin at midnight.
Visibility model
As with Calendrical.Islamic.Observational, crescent visibility
is computed by Astro.new_visible_crescent/3 using the Odeh (2006)
criterion by default.
Reference
- CLDR
:islamic_rgsacalendar type. Thergsasuffix denotes "Religious Saudi Arabia". - Dershowitz & Reingold, Calendrical Calculations (4th ed.), Chapter 14.
Summary
Functions
Identifies whether this calendar is month or week based.
Returns the calendar year as displayed on rendered calendars.
Defines the CLDR calendar type for this calendar.
Returns the cyclic year as displayed on rendered calendars.
Returns a Saudi sighting-based Islamic {year, month, day} for
the given ISO day number.
Returns the number of ISO days for the given Saudi sighting-based
Islamic year, month, and day.
Calculates the day and era from the given
year, month, and day.
Calculates the day of the year from the given
year, month, and day.
Returns how many days there are in the given month.
Returns the number of days in the given Hijri year and month
(29 or 30, determined by predicted crescent visibility at Mecca).
Returns the number days in a a week.
Returns the number of days in the given Hijri year.
Returns the extended year as displayed on rendered calendars.
Calculates the ISO week of the year from the
given year, month, and day.
Returns whether the given Hijri year is a 355-day year (the
sighting-based analogue of a "leap year").
Returns the geographic location used to determine crescent visibility for this calendar.
Returns a Date.Range.t/0 representing
a given month of a year.
Returns the month of the year from the given
year, month, and day.
Returns the number of months in a leap year.
Returns the number of months in a normal year.
Returns the number of months in a year, without a year.
Returns the number of months in a
given year.
Converts the t:Calendar.iso_days format to the
datetime format specified by this calendar.
Returns the t:Calendar.iso_days format of
the specified date.
Returns the number of periods in a given
year. A period corresponds to a month
in month-based calendars and a week in
week-based calendars.
Adds an increment number of date_parts
to a year-month-day.
Returns a Date.Range.t/0 representing
a given quarter of a year.
Returns the quarter of the year from the given
year, month, and day.
Returns the related Gregorian year as displayed on rendered calendars.
Returns whether the given year, month, and day form a valid
Saudi sighting-based Islamic date.
Returns a Date.Range.t/0 representing
a given week of a year.
Calculates the week of the year from the given
year, month, and day.
Calculates the week of the year from the given
year, month, and day.
Returns the number of weeks in a
given year.
Returns a Date.Range.t/0 representing
a given year.
Calculates the year and era from the given year.
Calculates the year and era from the given date.
Types
Functions
Identifies whether this calendar is month or week based.
@spec calendar_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.year()
Returns the calendar year as displayed on rendered calendars.
Defines the CLDR calendar type for this calendar.
This type is used in support of Calendrical. localize/3.
@spec cyclic_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.year()
Returns the cyclic year as displayed on rendered calendars.
Returns a Saudi sighting-based Islamic {year, month, day} for
the given ISO day number.
Arguments
iso_daysis an integer count of days since the proleptic ISO epoch.
Returns
A three-tuple
{year, month, day}in the Saudi sighting-based Islamic calendar.Raises
Calendrical.UnsupportedDateRangeErrorifiso_daysfalls outside the range of the underlying JPL ephemeris.
Examples
iex> Calendrical.Islamic.Rgsa.date_from_iso_days(739_252)
{1445, 6, 20}
Returns the number of ISO days for the given Saudi sighting-based
Islamic year, month, and day.
Arguments
yearis any Hijri year as an integer.monthis a Hijri month in the range1..12.dayis a Hijri day-of-month in the range1..30.
Returns
An integer count of days since the proleptic ISO epoch.
Raises
Calendrical.UnsupportedDateRangeErrorif the date falls outside the range of the underlying JPL ephemeris.
Examples
iex> Calendrical.Islamic.Rgsa.date_to_iso_days(1446, 1, 1)
739439
@spec day_of_era(Calendar.year(), Calendar.month(), Calendar.day()) :: {day :: Calendar.day(), era :: Calendar.era()}
Calculates the day and era from the given
year, month, and day.
By default we consider on two eras: before the epoch and on-or-after the epoch.
@spec day_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.day()
Calculates the day of the year from the given
year, month, and day.
@spec days_in_month(Calendar.month()) :: Calendar.month() | {:ambiguous, Range.t() | [pos_integer()]} | {:error, :undefined}
Returns how many days there are in the given month.
Must be implemented in derived calendars because we cannot know what the calendar format is.
@spec days_in_month(Calendar.year(), Calendar.month()) :: Calendar.month()
@spec days_in_month(year(), month()) :: 29..30
Returns the number of days in the given Hijri year and month
(29 or 30, determined by predicted crescent visibility at Mecca).
Arguments
yearis any Hijri year as an integer.monthis a Hijri month in the range1..12.
Returns
- The number of days in the month (
29or30).
Examples
iex> Calendrical.Islamic.Rgsa.days_in_month(1446, 1)
30
iex> Calendrical.Islamic.Rgsa.days_in_month(1446, 4)
29
Returns the number days in a a week.
@spec days_in_year(year()) :: 354..355
Returns the number of days in the given Hijri year.
Arguments
yearis any Hijri year as an integer.
Returns
354for an ordinary year or355for a leap year.
Examples
iex> Calendrical.Islamic.Rgsa.days_in_year(1446)
354
@spec extended_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.year()
Returns the extended year as displayed on rendered calendars.
@spec iso_week_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: {:error, :not_defined}
Calculates the ISO week of the year from the
given year, month, and day.
By default this function always returns
{:error, :not_defined}.
Returns whether the given Hijri year is a 355-day year (the
sighting-based analogue of a "leap year").
Year length varies between 354 and 355 days depending on predicted crescent sightings at Mecca, so this is computed by comparing the starts of two successive years.
Arguments
yearis any Hijri year as an integer.
Returns
trueif the year contains 355 days; otherwisefalse.
Examples
iex> Calendrical.Islamic.Rgsa.leap_year?(1447)
true
iex> Calendrical.Islamic.Rgsa.leap_year?(1446)
false
@spec location() :: Geo.PointZ.t()
Returns the geographic location used to determine crescent visibility for this calendar.
Returns
- A
Geo.PointZ.t/0for Mecca, Saudi Arabia (the al-Masjid al-Ḥarām).
Examples
iex> Calendrical.Islamic.Rgsa.location().coordinates
{39.8262, 21.4225, 277.0}
Returns a Date.Range.t/0 representing
a given month of a year.
@spec month_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendar.month() | {Calendar.month(), Calendrical.leap_month?()}
Returns the month of the year from the given
year, month, and day.
Returns the number of months in a leap year.
Returns the number of months in a normal year.
Returns the number of months in a year, without a year.
Returns an integer when every year has the same number of
months, or {:ambiguous, first..last} for lunisolar calendars
whose year length varies (e.g. the Hebrew calendar's 12 or 13
months).
Returns the number of months in a
given year.
@spec naive_datetime_from_iso_days(Calendar.iso_days()) :: {Calendar.year(), Calendar.month(), Calendar.day(), Calendar.hour(), Calendar.minute(), Calendar.second(), Calendar.microsecond()}
Converts the t:Calendar.iso_days format to the
datetime format specified by this calendar.
@spec naive_datetime_to_iso_days( Calendar.year(), Calendar.month(), Calendar.day(), Calendar.hour(), Calendar.minute(), Calendar.second(), Calendar.microsecond() ) :: Calendar.iso_days()
Returns the t:Calendar.iso_days format of
the specified date.
Returns the number of periods in a given
year. A period corresponds to a month
in month-based calendars and a week in
week-based calendars.
Adds an increment number of date_parts
to a year-month-day.
date_part can be :years, :months, :weeks or :days.
Returns a Date.Range.t/0 representing
a given quarter of a year.
@spec quarter_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: Calendrical.quarter()
Returns the quarter of the year from the given
year, month, and day.
Returns whether the given year, month, and day form a valid
Saudi sighting-based Islamic date.
Arguments
yearis any positive Hijri year as an integer.monthis a Hijri month in the range1..12.dayis a Hijri day-of-month in the range1..30.
Returns
trueif the date is valid; otherwisefalse.
Examples
iex> Calendrical.Islamic.Rgsa.valid_date?(1446, 1, 30)
true
iex> Calendrical.Islamic.Rgsa.valid_date?(1446, 4, 30)
false
Returns a Date.Range.t/0 representing
a given week of a year.
@spec week_of_month(Calendar.year(), Calendar.month(), Calendar.day()) :: {pos_integer(), pos_integer()} | {:error, :not_defined}
Calculates the week of the year from the given
year, month, and day.
By default this function always returns
{:error, :not_defined}.
@spec week_of_year(Calendar.year(), Calendar.month(), Calendar.day()) :: {:error, :not_defined}
Calculates the week of the year from the given
year, month, and day.
By default this function always returns
{:error, :not_defined}.
Returns the number of weeks in a
given year.
Returns a Date.Range.t/0 representing
a given year.
@spec year_of_era(Calendar.year()) :: {year :: Calendar.year(), era :: Calendar.era()}
Calculates the year and era from the given year.
@spec year_of_era(Calendar.year(), Calendar.month(), Calendar.day()) :: {year :: Calendar.year(), era :: Calendar.era()}
Calculates the year and era from the given date.