Packages
timex
3.7.2
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/parse/datetime/helpers.ex
defmodule Timex.Parse.DateTime.Helpers do
@moduledoc false
import Combine.Parsers.Base
import Combine.Parsers.Text, except: [integer: 0, integer: 1]
alias Combine.Parsers.Text
use Timex.Constants
def months do
@month_names ++ Map.values(Timex.Translator.get_months(Timex.Translator.current_locale()))
end
def months_abbr do
@month_abbrs ++
Map.values(Timex.Translator.get_months_abbreviated(Timex.Translator.current_locale()))
end
def to_month(month) when is_integer(month), do: [month: month]
def to_month_num(m) when m in ["January", "Jan"], do: to_month(1)
def to_month_num(m) when m in ["February", "Feb"], do: to_month(2)
def to_month_num(m) when m in ["March", "Mar"], do: to_month(3)
def to_month_num(m) when m in ["April", "Apr"], do: to_month(4)
def to_month_num(m) when m in ["May", "May"], do: to_month(5)
def to_month_num(m) when m in ["June", "Jun"], do: to_month(6)
def to_month_num(m) when m in ["July", "Jul"], do: to_month(7)
def to_month_num(m) when m in ["August", "Aug"], do: to_month(8)
def to_month_num(m) when m in ["September", "Sep"], do: to_month(9)
def to_month_num(m) when m in ["October", "Oct"], do: to_month(10)
def to_month_num(m) when m in ["November", "Nov"], do: to_month(11)
def to_month_num(m) when m in ["December", "Dec"], do: to_month(12)
def to_month_num(m) when is_binary(m) do
Map.fetch!(Timex.Translator.get_months_lookup(Timex.Translator.current_locale()), m)
end
def is_weekday(name) do
n = String.downcase(name)
cond do
n in @weekday_abbrs_lower ->
true
n in @weekday_names_lower ->
true
Map.has_key?(Timex.Translator.get_weekdays_lookup(Timex.Translator.current_locale()), name) ->
true
:else ->
false
end
end
def to_weekday(name) do
n = String.downcase(name)
case n do
n when n in ["mon", "monday"] ->
1
n when n in ["tue", "tuesday"] ->
2
n when n in ["wed", "wednesday"] ->
3
n when n in ["thu", "thursday"] ->
4
n when n in ["fri", "friday"] ->
5
n when n in ["sat", "saturday"] ->
6
n when n in ["sun", "sunday"] ->
7
_ ->
Map.fetch!(Timex.Translator.get_weekdays_lookup(Timex.Translator.current_locale()), name)
end
end
def to_sec_ms(fraction) do
precision = byte_size(fraction)
n = String.to_integer(fraction)
n = n * div(1_000_000, trunc(:math.pow(10, precision)))
case n do
0 -> [sec_fractional: {0, 0}]
_ -> [sec_fractional: {n, precision}]
end
end
def parse_milliseconds(ms) do
n = ms |> String.trim_leading("0")
n = if n == "", do: 0, else: String.to_integer(n)
n = n * 1_000
[sec_fractional: Timex.DateTime.Helpers.construct_microseconds(n, -1)]
end
def parse_microseconds(us) do
n_width = byte_size(us)
trailing = n_width - byte_size(String.trim_trailing(us, "0"))
cond do
n_width == trailing ->
[sec_fractional: {0, n_width}]
:else ->
p = n_width - trailing
p = if p > 6, do: 6, else: p
n = us |> String.trim("0") |> String.to_integer()
[sec_fractional: {n * trunc(:math.pow(10, 6 - p)), p}]
end
end
def ampm_lower do
["am", "pm"] ++
Timex.Translator.get_day_periods_lower(Timex.Translator.current_locale())
end
def ampm_upper do
["AM", "PM"] ++
Timex.Translator.get_day_periods_upper(Timex.Translator.current_locale())
end
def ampm_any do
ampm_lower() ++ ampm_upper()
end
def to_ampm("am"), do: [am: "am"]
def to_ampm("AM"), do: [AM: "AM"]
def to_ampm("pm"), do: [am: "pm"]
def to_ampm("PM"), do: [AM: "PM"]
def to_ampm(value) when is_binary(value) do
type =
Map.fetch!(
Timex.Translator.get_day_periods_lookup(Timex.Translator.current_locale()),
value
)
[{type, value}]
end
def integer(opts \\ []) do
min_width =
case Keyword.get(opts, :padding) do
:none ->
1
_ ->
get_in(opts, [:min]) || 1
end
max_width = get_in(opts, [:max])
padding = get_in(opts, [:padding])
case {padding, min_width, max_width} do
{:zeroes, _, nil} -> Text.integer()
{:zeroes, min, max} -> choice(Enum.map(max..min, &fixed_integer(&1)))
{:spaces, -1, nil} -> skip(spaces()) |> Text.integer()
{:spaces, min, nil} -> skip(spaces()) |> fixed_integer(min)
{:spaces, _, max} -> skip(spaces()) |> choice(Enum.map(max..1, &fixed_integer(&1)))
{_, -1, nil} -> Text.integer()
{_, min, nil} -> fixed_integer(min)
{_, min, max} -> choice(Enum.map(max..min, &fixed_integer(&1)))
end
end
end