Calendrical.Islamic.UmmAlQura (Calendrical v0.3.0)

Copy Markdown

Implementation of the Saudi Arabian Umm al-Qura calendar.

The Umm al-Qura (أم القرى, "Mother of Towns" — a name for Mecca) calendar is the official Hijri calendar of the Kingdom of Saudi Arabia and the basis for date calculations published by the King Abdulaziz City for Science and Technology (KACST). It differs from the purely tabular Hijri calendars (Calendrical.Islamic.Civil and Calendrical.Islamic.Tbla) in that the start of each month is determined by an astronomical observation rule applied at Mecca rather than by a fixed arithmetic cycle. Individual months may therefore deviate from the tabular value by up to a day.

This module embeds the official KACST Umm al-Qura tables (sourced from R.H. van Gent's Utrecht University dataset, cross-referenced against the KACST publications) at compile time. Every conversion between an Umm al-Qura date and a Gregorian date is therefore an O(log n) lookup with no floating-point arithmetic at runtime.

Coverage

The embedded data covers approximately 1356 AH through ~1500 AH (March 1937 CE through ~2076 CE). Dates outside this range raise Calendrical.IslamicYearOutOfRangeError from date_to_iso_days/3 and date_from_iso_days/1.

Days are assumed to begin at midnight rather than at sunset.

Reference

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 the Umm al-Qura {year, month, day} for the given ISO day number.

Returns the number of ISO days for the given Umm al-Qura 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. Months are 29 or 30 days as determined by the published Umm al-Qura tables.

Returns the number days in a a week.

Returns the number of days in the given Hijri year (354 or 355).

Returns the extended year as displayed on rendered calendars.

Returns the Gregorian Calendar.date/0 of the first day of the given Hijri month according to the official Umm al-Qura tables.

Calculates the ISO week of the year from the given year, month, and day.

Returns whether the given Hijri year is a leap year (355 days).

Returns the last Hijri year covered by the embedded Umm al-Qura reference data.

Returns the first Hijri year covered by the embedded Umm al-Qura reference data.

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 given Umm al-Qura date is valid.

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() :: pos_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 the Umm al-Qura {year, month, day} for the given ISO day number.

Raises Calendrical.IslamicYearOutOfRangeError if iso_days is outside the embedded reference range.

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 Umm al-Qura year, month, and day.

Raises Calendrical.IslamicYearOutOfRangeError if the date is outside the embedded reference range.

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 the number of days in the given Hijri year and month. Months are 29 or 30 days as determined by the published Umm al-Qura tables.

days_in_week()

Returns the number days in a a week.

days_in_year(year)

Returns the number of days in the given Hijri year (354 or 355).

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_month(hijri_year, hijri_month)

@spec first_day_of_month(year(), month()) :: {:ok, Date.t()} | {:error, Exception.t()}

Returns the Gregorian Calendar.date/0 of the first day of the given Hijri month according to the official Umm al-Qura tables.

Returns {:error, %Calendrical.IslamicYearOutOfRangeError{}} if the requested month falls outside the embedded data range.

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()

leap_year?(year)

Returns whether the given Hijri year is a leap year (355 days).

max_year()

@spec max_year() :: pos_integer()

Returns the last Hijri year covered by the embedded Umm al-Qura reference data.

min_year()

@spec min_year() :: pos_integer()

Returns the first Hijri year covered by the embedded Umm al-Qura reference data.

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 given Umm al-Qura date is valid.

A date is valid if its year falls within the embedded reference range, its month is in 1..12, and its day is between 1 and the number of days in that month according to the published tables.

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.