Packages

ex_cldr

0.12.1
2.47.5 2.47.4 2.47.3 2.47.2 2.47.1 2.47.0 2.46.0 2.45.2 2.45.1 2.45.0 2.44.1 2.44.0 2.43.2 2.43.1 2.43.0 2.42.0 2.41.1 2.41.0 2.40.4 2.40.3 2.40.2 2.40.1 2.40.0 2.39.2 2.39.1 2.39.0 2.38.1 2.38.0 2.37.5 2.37.4 2.37.3 retired 2.37.2 2.37.1 2.37.0 2.36.0 2.35.1 2.35.0 retired 2.34.2 2.34.1 2.34.0 2.33.2 2.33.1 2.33.1-rc.0 2.33.0 2.32.1 2.32.0 2.31.0 2.30.0 2.29.0 2.28.0 2.27.1 2.27.0 retired 2.26.3 2.26.2 2.26.1 2.26.0 2.25.0 2.24.2 2.24.1 2.24.0 2.24.0-rc.6 2.24.0-rc.5 2.24.0-rc.4 2.24.0-rc.3 2.24.0-rc.2 2.24.0-rc.1 2.24.0-rc.0 2.23.2 2.23.1 2.23.0 2.22.1 2.22.0 2.21.0 2.20.0 2.20.0-rc.3 2.20.0-rc.2 2.20.0-rc.1 2.20.0-rc.0 2.19.1 2.19.0 2.18.2 2.18.1 2.18.0 2.18.0-rc.0 2.17.2 2.17.1 2.17.0 2.16.2 2.16.1 2.16.1-rc.0 2.16.0 2.15.0 2.14.1 2.14.0 2.14.0-rc.0 2.13.0 2.12.1 2.12.0 2.11.1 2.11.0 2.10.2 2.10.1 2.10.0 retired 2.9.0 2.8.1 2.8.0 2.7.2 2.7.1 2.7.0 2.6.2 2.6.1 2.6.0 2.5.0 2.4.3 2.4.2 2.4.1 2.4.0 2.3.2 2.3.1 2.3.0 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.3 retired 2.0.0-rc.2 retired 2.0.0-rc.1 retired 2.0.0-rc.0 retired 1.8.2 1.8.1 1.8.0 1.7.1 1.7.0 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 retired 1.4.0-rc.3 retired 1.4.0-rc.2 retired 1.4.0-rc.1 retired 1.4.0-rc.0 retired 1.3.2 1.3.1 1.3.0 1.2.0 1.1.0 1.0.0 1.0.0-rc.3 retired 1.0.0-rc.2 retired 1.0.0-rc.1 retired 1.0.0-rc.0 retired 0.13.1 0.13.0 0.12.2 retired 0.12.1 retired 0.12.0 retired 0.11.0 retired 0.10.0 retired 0.9.0 retired 0.8.3 retired 0.8.2 retired 0.8.1 retired 0.8.0 retired 0.7.0 retired 0.6.2 retired 0.6.1 retired 0.6.0 retired 0.5.2 retired 0.5.1 retired 0.5.0 retired 0.4.2 retired 0.4.1 retired 0.4.0 retired 0.3.0 retired 0.2.1 retired 0.2.0 retired 0.1.3 retired 0.1.2 retired 0.1.1 retired 0.1.0 retired 0.0.20 retired 0.0.19 retired 0.0.18 retired 0.0.17 retired 0.0.16 retired 0.0.15 retired 0.0.14 retired 0.0.13 retired 0.0.12 retired 0.0.11 retired 0.0.10 retired 0.0.8 retired 0.0.7 retired 0.0.6 retired 0.0.5 retired 0.0.4 retired 0.0.3 retired

Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.

Retired package: Deprecated

Current section

Files

Jump to
ex_cldr lib cldr helpers calendar_conversion.ex
Raw

lib/cldr/helpers/calendar_conversion.ex

defmodule Cldr.Calendar.Conversion do
def convert_eras_to_iso_days(calendar_data) do
Enum.map(calendar_data, fn {calendar, content} ->
{calendar, adjust_eras(content)}
end)
|> Enum.into(%{})
end
defp adjust_eras(%{"eras" => eras} = content) do
eras =
eras
|> Enum.map(fn {era, dates} -> {era, adjust_era(dates)} end)
|> Enum.into(%{})
Map.put(content, "eras", eras)
end
defp adjust_eras(%{} = content) do
content
end
defp adjust_era(dates) do
Enum.map(dates, fn
{"start", date} -> {"start", to_iso_days(date)}
{"end", date} -> {"end", to_iso_days(date)}
{k, v} -> {k, v}
end)
|> Enum.into(%{})
end
def parse_time_periods(period_data) do
Enum.map(period_data, fn {language, periods} ->
{language, adjust_periods(periods)}
end)
|> Enum.into(%{})
end
defp adjust_periods(periods) do
Enum.map(periods, fn {period, times} ->
{period, adjust_times(times)}
end)
|> Enum.into(%{})
end
defp adjust_times(times) do
Enum.map(times, fn {key, time} ->
{key, Enum.map(String.split(time, ":"), &String.to_integer/1)}
end)
|> Enum.into(%{})
end
def to_iso_days(%{year: year, month: month, day: day}) do
gregorian_date_to_iso_days(year, month, day)
end
def to_iso_days(date) when is_binary(date) do
{year, month, day} = case String.split(date, "-") do
[year, month, day] ->
{String.to_integer(year), String.to_integer(month), String.to_integer(day)}
["", year, month, day] ->
{String.to_integer("-#{year}"), String.to_integer(month), String.to_integer(day)}
end
gregorian_date_to_iso_days(year, month, day)
end
@doc """
Converts a `year`, `month` and `day` into a number of days
for the gregorian calendar
This should be done in the Calendar.ISO module but today that
module doesnt handle negative years which are needed here.
"""
def gregorian_date_to_iso_days(year, month, day) do
correction =
cond do
month <= 2 -> 0
leap_year?(year) -> -1
true -> -2
end
(gregorian_epoch_days() - 1) +
(365 * (year - 1)) +
Float.floor((year - 1) / 4) -
Float.floor((year - 1) / 100) +
Float.floor((year - 1) / 400) +
Float.floor((367 * month - 362) / 12) +
correction + day |> trunc
end
@doc """
Returns true if the given year is a leap year.
"""
def leap_year?(year) when is_integer(year) do
mod(year, 4) === 0 and (mod(year, 100) > 0 or mod(year, 400) === 0)
end
defp gregorian_epoch_days do
1
end
def mod(x, y) when is_integer(x) and is_integer(y) do
mod(x * 1.0, y) |> round
end
def mod(x, y) do
x - (y * Float.floor(x / y))
end
end