Provides localized formatting of Date structs and date-like maps.
Supports both full dates (%{year: _, month: _, day: _}) and partial
dates (any map with one or more of :year, :month, :day). For
partial dates, the format is derived from the available fields.
Formats are defined in CLDR and described in TR35.
Summary
Functions
Parses a localized date string.
Formats a date into typed parts, mirroring ECMA-402's formatToParts.
Same as to_parts/2 but raises on error.
Formats a date according to a CLDR format pattern.
Same as to_string/2 but raises on error.
Functions
@spec parse(String.t(), Keyword.t()) :: {:ok, Date.t()} | {:error, Exception.t()}
Parses a localized date string.
Parsing lives in the companion calendrical
package, which carries the calendar systems Localize formats for.
calendrical depends on Localize, so Localize resolves it at runtime rather
than depending on it in return — add {:calendrical, "~> 1.0"} to your
dependencies to use this function.
Arguments
stringis a string in any shape the locale accepts, including the locale's CLDR short, medium, long and full patterns and ISO 8601.optionsis a keyword list of options.
Options
:localeis a locale identifier. The default is the locale returned byLocalize.get_locale/0.Remaining options are passed to
Calendrical.Date.parse/2, which documents them.
Returns
{:ok, value}wherevalueis at:Date.t(), or{:error, exception}if the string does not parse, or aLocalize.DependencyRequiredError.t/0ifcalendricalis not among the application's dependencies.
Examples
Shown rather than run as doctests: calendrical is not a dependency of
Localize itself, so the call does not resolve in this package's own tests.
Localize.Date.parse("22.03.2026", locale: :de)
#=> {:ok, ~D[2026-03-22]}
Localize.Date.parse("March 22, 2026", locale: :en)
#=> {:ok, ~D[2026-03-22]}
@spec to_parts(map(), Keyword.t()) :: {:ok, [%{type: atom(), value: String.t()}]} | {:error, Exception.t()}
Formats a date into typed parts, mirroring ECMA-402's formatToParts.
The parts concatenate to exactly the string to_string/2 produces with the same options. Each pattern field is tagged with its type: :year, :month, :day, :weekday, :era, and :literal for separators.
Arguments
dateis aDate.t/0or any map with date keys.optionsis a keyword list of options.
Options
See to_string/2 for the supported options.
Returns
{:ok, parts}wherepartsis a list of%{type: atom(), value: String.t()}maps.{:error, exception}if the date cannot be formatted.
Examples
iex> Localize.Date.to_parts(~D[2017-07-10], locale: :en)
{:ok,
[
%{type: :month, value: "Jul"},
%{type: :literal, value: " "},
%{type: :day, value: "10"},
%{type: :literal, value: ", "},
%{type: :year, value: "2017"}
]}
Same as to_parts/2 but raises on error.
Arguments
dateis aDate.t/0or any map with date keys.optionsis a keyword list of options. Seeto_parts/2.
Returns
- A list of
%{type: atom(), value: String.t()}maps.
Raises
- Raises an exception if the date cannot be formatted.
Examples
iex> Localize.Date.to_parts!(~D[2017-07-10], locale: :en) |> length()
5
@spec to_string(map(), Keyword.t()) :: {:ok, String.t()} | {:error, Exception.t()}
Formats a date according to a CLDR format pattern.
Arguments
dateis aDate.t/0or any map with one or more of:year,:month,:daykeys.optionsis a keyword list of options.
Options
:formatis a standard format name (:short,:medium,:long,:full), a format skeleton atom, or a format pattern string. The default is:mediumfor full dates. For partial dates the format is derived from the available fields.:localeis a locale identifier. The default is:en.:number_systemis a CLDR numbering system name (for example,:thai). All numeric fields render in that system; a-u-nu-locale extension may be used instead. The default is the locale's number system.:preferselects between CLDRaltvariants. Accepts an atom or a list of atoms in priority order. Recognised values::standard/:variant(locales like en-CA publish both an ISO pattern"y-MM-dd"and a locale-variant"d/M/yy"), and:unicode/:ascii(NBSP and curly quotes vs ASCII). Examples:prefer: :variant,prefer: [:variant, :ascii]. The default is[:standard, :unicode].
Returns
{:ok, formatted_string}on success.{:error, exception}if the date cannot be formatted.
Examples
iex> Localize.Date.to_string(~D[2017-07-10], locale: :en)
{:ok, "Jul 10, 2017"}
iex> Localize.Date.to_string(~D[2017-07-10], format: :full, locale: :en)
{:ok, "Monday, July 10, 2017"}
iex> Localize.Date.to_string(~D[2017-07-10], format: :short, locale: :en)
{:ok, "7/10/17"}
iex> Localize.Date.to_string(~D[2017-07-10], format: :short, locale: :fr)
{:ok, "10/07/2017"}
iex> Localize.Date.to_string(%{year: 2024, month: 6}, format: :yMMM, locale: :fr)
{:ok, "juin 2024"}
Same as to_string/2 but raises on error.
Arguments
dateis aDate.t/0or any map with one or more of:year,:month,:daykeys.optionsis a keyword list of options.
Options
See to_string/2 for the supported options.
Returns
A formatted string.
Raises an exception if the date cannot be formatted.
Examples
iex> Localize.Date.to_string!(~D[2017-07-10], locale: :en)
"Jul 10, 2017"
iex> Localize.Date.to_string!(%{year: 2024, month: 6}, format: :yMMM, locale: :fr)
"juin 2024"