The date of a named computed event in a year: an event fixed by an algorithm rather than by the calendar.
Four families are built in: Easter, Western and Orthodox, from
Calendrical.Ecclesiastical; the equinoxes and solstices and the first
new moon of the year, from Astro; and the twenty-four solar terms
(jié-qì) of the East Asian calendars, from Calendrical, reckoned at the
meridian of the calendar asked. A consumer adds its own with a
Tempo.Event.Resolver.
ISO 8601-2 has no notation for such a date, so Tempo writes it as a
selection (name)e and asks here for it, once per year, when a selection
or a recurrence such as ~o"R/../P1Y/FL(easter)eN" is given its spans.
Summary
Functions
The date of a named event in a year of the proleptic Gregorian calendar.
The names of the events date/3 resolves: the built-ins and every name a
registered Tempo.Event.Resolver claims, sorted.
Whether a name is one of the twenty-four solar terms.
Functions
@spec date(String.t(), integer(), module()) :: {:ok, Date.t()} | {:error, Exception.t()}
The date of a named event in a year of the proleptic Gregorian calendar.
Arguments
nameis an eventknown/0lists. An equinox or a solstice may name the zone whose date it takes after an@, an IANA zone or a±HH:MMoffset ("march-equinox@+09:00"), the instant falling on another date there than in UTC.yearis the Gregorian year.calendaris the calendar whose meridian a solar term is reckoned at: one of Calendrical's lunisolar calendars, or the Gregorian, the default, which reckons it at the Chinese meridian.
Returns
{:ok, date}, aDate.t/0inCalendar.ISO.{:error, %Tempo.InvalidDateError{unit: :event}}whose reason is{:unknown_event, name},{:no_instant, name}for an@zone after an event that is no instant,{:no_solar_terms, calendar},:year_out_of_rangefor a yearAstrodoes not reach, or a resolver's own reason.{:error, %Tempo.ZoneError{reason: :unknown}}for a zone after an@that is none.{:error, %ArgumentError{}}for a name that is no string or a year that is no integer.
Examples
iex> Tempo.Event.date("easter", 2026)
{:ok, ~D[2026-04-05]}
iex> Tempo.Event.date("orthodox-easter", 2026)
{:ok, ~D[2026-04-12]}
iex> Tempo.Event.date("december-solstice", 2026)
{:ok, ~D[2026-12-21]}
iex> Tempo.Event.date("march-equinox@+09:00", 2002)
{:ok, ~D[2002-03-21]}
iex> Tempo.Event.date("qingming", 2026, Calendrical.Gregorian)
{:ok, ~D[2026-04-05]}
iex> {:error, %Tempo.InvalidDateError{reason: {:unknown_event, "brigadoon"}}} =
...> Tempo.Event.date("brigadoon", 2026)
@spec known() :: [String.t()]
The names of the events date/3 resolves: the built-ins and every name a
registered Tempo.Event.Resolver claims, sorted.
Returns
- A sorted list of event names, each a string.
Examples
iex> "qingming" in Tempo.Event.known()
true
iex> "easter" in Tempo.Event.known()
true
Whether a name is one of the twenty-four solar terms.
Arguments
nameis an event's name, a string.
Returns
truefor one of the twenty-four, andfalsefor any other name. A name that is no string raises anArgumentError.
Examples
iex> Tempo.Event.solar_term?("qingming")
true
iex> Tempo.Event.solar_term?("easter")
false