Packages
timex
3.1.15
3.7.13
3.7.12
3.7.11
3.7.9
3.7.8
3.7.7
3.7.6
3.7.5
3.7.3
3.7.2
3.7.1
3.7.0
3.6.4
3.6.3
3.6.2
retired
3.6.1
3.6.0
3.5.0
3.4.2
3.4.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.25
retired
3.1.24
3.1.23
3.1.22
3.1.21
3.1.20
3.1.19
3.1.18
3.1.17
3.1.16
3.1.15
3.1.13
3.1.12
3.1.11
3.1.10
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.2.1
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.0
1.0.2
1.0.1
1.0.0
1.0.0-rc4
1.0.0-rc3
1.0.0-rc2
1.0.0-rc1
1.0.0-pre
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.2
0.18.1
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.6.0
0.5.0
0.4.8
0.4.7
0.4.6
Timex is a rich, comprehensive Date/Time library for Elixir projects, with full timezone support via the :tzdata package. If you need to manipulate dates, times, datetimes, timestamps, etc., then Timex is for you!
Current section
Files
Jump to
Current section
Files
lib/convert/convert.ex
defmodule Timex.Convert do
@moduledoc false
@doc """
Converts a map to a Date, NaiveDateTime or DateTime, depending on the amount
of date/time information in the map.
"""
@spec convert_map(Map.t) :: Date.t | DateTime.t | NaiveDateTime.t | {:error, term}
def convert_map(map) when is_map(map) do
case convert_keys(map) do
{:error, _} = err ->
err
datetime_map when is_map(datetime_map) ->
year = Map.get(datetime_map, :year)
month = Map.get(datetime_map, :month)
day = Map.get(datetime_map, :day)
cond do
not(is_nil(year)) and not(is_nil(month)) and not(is_nil(day)) ->
case Map.get(datetime_map, :hour) do
nil ->
Date.new(year, month, day)
hour ->
minute = Map.get(datetime_map, :minute, 0)
second = Map.get(datetime_map, :second, 0)
us = Map.get(datetime_map, :microsecond, 0)
tz = Map.get(datetime_map, :time_zone, nil)
case tz do
s when is_binary(s) ->
Timex.DateTime.Helpers.construct({{year,month,day},{hour,minute,second,us}}, tz)
nil ->
{:ok, nd} = NaiveDateTime.new(year, month, day, hour, minute, second, us)
nd
end
end
:else ->
{:error, :insufficient_date_information}
end
end
end
def try_convert(_), do: {:error, :invalid_date}
@allowed_keys_atom [
:year, :month, :day,
:hour, :minute, :min, :mins, :second, :sec, :secs,
:milliseconds, :millisecond, :ms,
:microsecond
]
@allowed_keys Enum.concat(@allowed_keys_atom, Enum.map(@allowed_keys_atom, &Atom.to_string/1))
@valid_keys_map %{
:min => :minute,
:mins => :minute,
:secs => :second,
:sec => :second,
:milliseconds => :millisecond,
:ms => :millisecond,
:microsecond => :microsecond,
:tz => :time_zone,
:timezone => :time_zone,
:time_zone => :time_zone
}
def convert_keys(map) when is_map(map) do
Enum.reduce(map, %{}, fn
{_, _}, {:error, _} = err -> err
{k, v}, acc when k in [:microsecond, "microsecond"] ->
case v do
{us, pr} when is_integer(us) and pr >= 0 and pr <= 6 ->
Map.put(acc, :microsecond, {us, pr})
us when is_integer(us) ->
Map.put(acc, :microsecond, {us, 6})
_ -> acc
end
{k, v}, acc when k in [:milliseconds, "milliseconds", :ms, "ms", :millisecond, "millisecond"] ->
case v do
n when is_integer(n) ->
us = Timex.DateTime.Helpers.construct_microseconds(n*1_000)
Map.put(acc, :microsecond, us)
:error ->
{:error, {:expected_integer, for: k, got: v}}
end
{k, v}, acc when k in [:tz, "tz", :timezone, "timezone", :time_zone, "time_zone"] ->
case v do
s when is_binary(s) -> Map.put(acc, :time_zone, s)
%{"full_name" => s} -> Map.put(acc, :time_zone, s)
_ -> acc
end
{k, v}, acc when k in @allowed_keys and is_atom(k) and is_integer(v) ->
case Map.get(@valid_keys_map, k) do
nil -> Map.put(acc, k, v)
vk -> Map.put(acc, vk, v)
end
{k, v}, acc when k in @allowed_keys and is_integer(v) ->
ak = String.to_atom(k)
case Map.get(@valid_keys_map, ak) do
nil -> Map.put(acc, ak, v)
vk -> Map.put(acc, vk, v)
end
{k, v}, acc when k in @allowed_keys and is_atom(k) and is_binary(v) ->
case Integer.parse(v) do
{n, _} ->
case Map.get(@valid_keys_map, k) do
nil -> Map.put(acc, k, n)
vk -> Map.put(acc, vk, n)
end
:error ->
{:error, {:expected_integer, for: k, got: v}}
end
{k, v}, acc when k in @allowed_keys and is_binary(v) ->
case Integer.parse(v) do
{n, _} ->
ak = String.to_atom(k)
case Map.get(@valid_keys_map, ak) do
nil -> Map.put(acc, ak, n)
vk -> Map.put(acc, vk, n)
end
:error ->
{:error, {:expected_integer, for: k, got: v}}
end
{_, _}, acc -> acc
end)
end
end