Calendrical.Ethiopic.AmeteAlem (Calendrical v0.13.0)

Copy Markdown

Implementation of the Ethiopic calendar with the Amete Alem (Era of the World, Anno Mundi) year numbering.

This calendar is structurally identical to Calendrical.Ethiopic โ€” same 13-month layout, same leap-year rule, same days-in-month โ€” but the year is counted from the traditional Ethiopian Christian date of the creation of the world rather than from the Era of Mercy:

amete_alem_year = amete_mihret_year + 5500

So 1 Amete Alem = -5499 Julian = -5492-07-17 proleptic Gregorian (per CLDR era data) and modern Ethiopic year 2017 (Amete Mihret) = 7517 Amete Alem.

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

Reference

  • Dershowitz & Reingold, Calendrical Calculations (4th ed.), ยง4.2 ("Ethiopic and Coptic Calendars").
  • CLDR :ethiopic_amete_alem calendar type. The CLDR era data places the aa era at proleptic Gregorian -5492-07-17.

See Calendrical.Ethiopic for the month structure and the mod(year, 4) == 3 leap-year rule.

Summary

Functions

Returns the Amete Alem year for the given Amete Mihret (Calendrical.Ethiopic) year.

Returns the corresponding Calendrical.Ethiopic (Amete Mihret) year for the given Amete Alem year.

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 Amete Alem {year, month, day} tuple for the given ISO day number.

Returns the number of ISO days for the given Amete Alem year, month, and day.

Calculates the day and era from the given year, month, and day.

Returns the day of the week for the given Amete Alem 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 Amete Alem year and month.

Returns the number days in a a week.

Returns the number of days in the given Amete Alem year.

Returns the offset (in years) between the Amete Alem (Era of the World) and the Amete Mihret (Era of Mercy) used by Calendrical.Ethiopic.

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 Amete Alem year is a leap year.

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 {:error, :not_defined} because the Ethiopic calendar does not define quarters; the year has 13 months and so does not divide evenly into four quarters.

Returns the related Gregorian year as displayed on rendered calendars.

Returns whether the given year, month, and day form a valid Amete Alem 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

day()

@type day() :: 1..30

month()

@type month() :: 1..13

year()

@type year() :: integer()

Functions

amete_alem_year(amete_mihret_year)

@spec amete_alem_year(integer()) :: year()

Returns the Amete Alem year for the given Amete Mihret (Calendrical.Ethiopic) year.

Arguments

  • amete_mihret_year is any Amete Mihret (Ethiopic) year as an integer.

Returns

  • An integer Amete Alem year (5500 more than the input).

Examples

iex> Calendrical.Ethiopic.AmeteAlem.amete_alem_year(2018)
7518

amete_mihret_year(amete_alem_year)

@spec amete_mihret_year(year()) :: integer()

Returns the corresponding Calendrical.Ethiopic (Amete Mihret) year for the given Amete Alem year.

Arguments

  • amete_alem_year is any Amete Alem year as an integer.

Returns

  • An integer Amete Mihret year (5500 less than the input).

Examples

iex> Calendrical.Ethiopic.AmeteAlem.amete_mihret_year(7518)
2018

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 an Amete Alem {year, month, day} tuple for the given ISO day number.

Arguments

  • iso_days is an integer count of days since the proleptic ISO epoch.

Returns

  • A three-tuple {year, month, day} in Amete Alem numbering.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.date_from_iso_days(740_000)
{7518, 5, 11}

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 Amete Alem year, month, and day.

Arguments

  • year is any Amete Alem year as an integer.

  • month is an Ethiopic month in the range 1..13.

  • day is an Ethiopic day-of-month.

Returns

  • An integer count of days since the proleptic ISO epoch.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.date_to_iso_days(7518, 1, 1)
739870

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_week(year, month, day, starting_on)

@spec day_of_week(
  Calendar.year(),
  Calendar.month(),
  Calendar.day(),
  :default | atom()
) ::
  {Calendar.day_of_week(), first_day_of_week :: non_neg_integer(),
   last_day_of_week :: non_neg_integer()}
@spec day_of_week(year(), month(), day(), :default) :: {1..7, 6, 5}

Returns the day of the week for the given Amete Alem year, month, and day.

Ethiopic weeks begin on Saturday, so the returned tuple has first_day_of_week = 6 and last_day_of_week = 5.

Arguments

  • year is any Amete Alem year as an integer.

  • month is an Ethiopic month in the range 1..13.

  • day is an Ethiopic day-of-month.

  • starting_on is :default for the calendar's natural week boundary (Saturday).

Returns

  • A three-tuple {day_of_week, first_day_of_week, last_day_of_week}.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.day_of_week(7518, 1, 1, :default)
{4, 6, 5}

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()) :: 5..30

Returns the number of days in the given Amete Alem year and month.

Months 1-12 always have 30 days; month 13 has 5 days, or 6 in a leap year.

Arguments

  • year is any Amete Alem year as an integer.

  • month is an Ethiopic month in the range 1..13.

Returns

  • An integer number of days.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.days_in_month(7518, 13)
5

iex> Calendrical.Ethiopic.AmeteAlem.days_in_month(7519, 13)
6

days_in_week()

Returns the number days in a a week.

days_in_year(year)

@spec days_in_year(year()) :: 365..366

Returns the number of days in the given Amete Alem year.

Arguments

  • year is any Amete Alem year as an integer.

Returns

  • 365 for an ordinary year or 366 for a leap year.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.days_in_year(7518)
365

iex> Calendrical.Ethiopic.AmeteAlem.days_in_year(7519)
366

epoch()

epoch_day_of_week()

era_offset()

@spec era_offset() :: 5500

Returns the offset (in years) between the Amete Alem (Era of the World) and the Amete Mihret (Era of Mercy) used by Calendrical.Ethiopic.

Subtracting this offset from an Amete Alem year yields the corresponding Amete Mihret year.

Returns

  • The integer 5500.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.era_offset()
5500

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

leap_year?(year)

@spec leap_year?(year()) :: boolean()

Returns whether the given Amete Alem year is a leap year.

The leap-year rule is that of Calendrical.Ethiopic applied to the corresponding Amete Mihret year.

Arguments

  • year is any Amete Alem year as an integer.

Returns

  • true if the year contains 366 days; otherwise false.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.leap_year?(7519)
true

iex> Calendrical.Ethiopic.AmeteAlem.leap_year?(7518)
false

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

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

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 :years, :months, :weeks or :days.

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 {:error, :not_defined} because the Ethiopic calendar does not define quarters; the year has 13 months and so does not divide evenly into four quarters.

Arguments

  • year is any Amete Alem year as an integer.

  • month is an Ethiopic month in the range 1..13.

  • day is an Ethiopic day-of-month.

Returns

  • {:error, :not_defined}.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.quarter_of_year(7518, 1, 1)
{:error, :not_defined}

valid_date?(year, month, day)

@spec valid_date?(year(), month(), day()) :: boolean()

Returns whether the given year, month, and day form a valid Amete Alem date.

Arguments

  • year is any Amete Alem year as an integer.

  • month is an Ethiopic month in the range 1..13.

  • day is an Ethiopic day-of-month. Months 1..12 have 30 days; month 13 has 5 days, or 6 in a leap year.

Returns

  • true if the date is valid; otherwise false.

Examples

iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7518, 1, 30)
true

iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7519, 13, 6)
true

iex> Calendrical.Ethiopic.AmeteAlem.valid_date?(7518, 13, 6)
false

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.