Calendrical.Islamic.Rgsa (Calendrical v0.3.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:

  • UmmAlQura uses 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.

  • Rgsa computes month starts from astronomical visibility at Mecca on demand. It is the algorithmic equivalent of the Saudi religious sighting practice and may diverge from UmmAlQura in 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_rgsa calendar type. The rgsa suffix 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 how many days there are in the given year and month.

Returns the number days in a a week.

Returns the number days in a given 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 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 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 gregorain year as displayed on rendered calendars.

Determines if the date given is valid according to this calendar.

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

day()

@type day() :: 1..30

month()

@type month() :: 1..12

year()

@type year() :: integer()

Functions

calendar_base()

Identifies whether this calendar is month or week based.

calendar_year(year, month, day)

@spec calendar_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()

Returns the calendar year as displayed on rendered calendars.

cldr_calendar_type()

Defines the CLDR calendar type for this calendar.

This type is used in support of Calendrical. localize/3.

cyclic_year(year, month, day)

@spec cyclic_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()

Returns the cyclic year as displayed on rendered calendars.

date_from_iso_days(iso_days)

@spec date_from_iso_days(integer()) :: {year(), month(), day()}

Returns a Saudi sighting-based Islamic {year, month, day} for the given ISO day number.

date_to_iso_days(year, month, day)

@spec date_to_iso_days(year(), month(), day()) :: integer()

Returns the number of ISO days for the given Saudi sighting-based Islamic year, month, and day.

day_of_era(year, month, day)

@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.

day_of_year(year, month, day)

@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.

days_in_month(month)

@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.

days_in_month(year, month)

@spec days_in_month(Calendar.year(), Calendar.month()) :: Calendar.month()
@spec days_in_month(year(), month()) :: 29..30

Returns how many days there are in the given year and month.

days_in_week()

Returns the number days in a a week.

days_in_year(year)

Returns the number days in a given year.

The year is the number of years since the epoch.

epoch()

epoch_day_of_week()

extended_year(year, month, day)

@spec extended_year(Calendar.year(), Calendar.month(), Calendar.day()) ::
  Calendar.year()

Returns the extended year as displayed on rendered calendars.

first_day_of_week()

iso_week_of_year(year, month, day)

@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}.

last_day_of_week()

location()

@spec location() :: Geo.PointZ.t()

Returns the geographic location used to determine crescent visibility for this calendar.

month(year, month)

Returns a Date.Range.t/0 representing a given month of a year.

month_of_year(year, month, day)

Returns the month of the year from the given year, month, and day.

months_in_leap_year()

Returns the number of months in a leap year.

months_in_ordinary_year()

Returns the number of months in a normal year.

months_in_year(year)

Returns the number of months in a given year.

naive_datetime_from_iso_days(arg)

Converts the t:Calendar.iso_days format to the datetime format specified by this calendar.

naive_datetime_to_iso_days(year, month, day, hour, minute, second, microsecond)

Returns the t:Calendar.iso_days format of the specified date.

periods_in_year(year)

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.

plus(year, month, day, date_part, increment, options \\ [])

Adds an increment number of date_parts to a year-month-day.

date_part can be :months only.

quarter(year, quarter)

Returns a Date.Range.t/0 representing a given quarter of a year.

quarter_of_year(year, month, day)

@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.

valid_date?(year, month, day)

Determines if the date given is valid according to this calendar.

week(year, week)

Returns a Date.Range.t/0 representing a given week of a year.

week_of_month(year, month, day)

@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}.

week_of_year(year, month, day)

@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}.

weeks_in_year(year)

Returns the number of weeks in a given year.

year(year)

Returns a Date.Range.t/0 representing a given year.

year_of_era(year)

@spec year_of_era(Calendar.year()) :: {year :: Calendar.year(), era :: Calendar.era()}

Calculates the year and era from the given year.

year_of_era(year, month, day)

@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.