Calendrical.Islamic.Observational
(Calendrical v0.3.0)
Copy Markdown
Implementation of the observational (sighting-based) Islamic calendar.
Unlike the tabular calendars in Calendrical.Islamic.Civil and
Calendrical.Islamic.Tbla, the start of each lunar month in this
calendar is determined by actual visibility of the new crescent
moon at a sample location. The location used here is Cairo,
Egypt (30.1° N, 31.3° E, 200 m), the canonical "Islamic location"
used by Dershowitz & Reingold's Calendrical Calculations.
This is the calendar identified by the CLDR :islamic calendar
type. Days are assumed to begin at midnight.
Visibility model
Crescent visibility is computed by Astro.new_visible_crescent/3
using the Odeh (2006) criterion by default — a modern
empirical model fitted against 737 historical sightings. The Odeh
criterion replaces Reingold's older Shaukat criterion and is the
basis for several national Islamic calendar committees.
Months are 29 or 30 days long depending on whether the crescent was visible on the eve of the 30th day; years are 354 or 355 days long.
Performance
Each calendar conversion makes a small number of crescent visibility calls (typically 1-3, plus one new-moon search). The underlying astronomical computations are not cached, so users that need to convert many dates may benefit from caching results externally.
Reference
- Dershowitz & Reingold, Calendrical Calculations (4th ed.), Chapter 14, "The Islamic and Saudi Arabian Calendars".
- Odeh, M. Sh. (2004), New Criterion for Lunar Crescent Visibility. Experimental Astronomy 18, 39–64.
- CLDR
:islamiccalendar type.
See also Calendrical.Islamic.Rgsa for the same algorithm applied
at Mecca, and Calendrical.Islamic.UmmAlQura for the official
Saudi tabular calendar.
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 an observational Islamic {year, month, day} for the
given ISO day number.
Returns the number of ISO days for the given observational
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 actual crescent visibility).
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.
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
observational 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
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 year, month, and day form a valid
observational 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 an observational Islamic {year, month, day} for the
given ISO day number.
Returns the number of ISO days for the given observational
Islamic year, month, and 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.
@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 actual crescent visibility).
Returns the number days in a a week.
Returns the number of days in the given Hijri year (354 or 355).
@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
observational analogue of a "leap year").
Year length varies between 354 and 355 days depending on actual crescent sightings, so this must be computed by comparing the starts of two successive years.
@spec location() :: Geo.PointZ.t()
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.
@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
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 :months only.
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.
Determines if the given year, month, and day form a valid
observational Islamic date.
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.