Packages
timex
3.6.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!
Retired package: handling of non-olson timezones was broken
Current section
Files
Jump to
Current section
Files
lib/timex/helpers.ex
defmodule Timex.Helpers do
@moduledoc false
use Timex.Constants
import Timex.Macros
alias Timex.Types
@doc """
Given a {year, day} tuple where the day is the iso day of that year, returns
the date tuple of format {year, month, day}.
## Examples
iex> Timex.Helpers.iso_day_to_date_tuple(1988, 240)
{1988, 8, 27}
If the given day or year are invalid a tuple of the format {:error, :reason}
is returned. For example:
iex> Timex.Helpers.iso_day_to_date_tuple(-50, 20)
{:error, :invalid_year}
iex> Timex.Helpers.iso_day_to_date_tuple(50, 400)
{:error, :invalid_day}
iex> Timex.Helpers.iso_day_to_date_tuple(-50, 400)
{:error, :invalid_year_and_day}
Days which are valid on leap years but not on non-leap years are invalid on
non-leap years. For example:
iex> Timex.Helpers.iso_day_to_date_tuple(2028, 366)
{2028, 12, 31}
iex> Timex.Helpers.iso_day_to_date_tuple(2027, 366)
{:error, :invalid_day}
"""
@spec iso_day_to_date_tuple(Types.year(), Types.day()) ::
Types.valid_datetime() | {:error, term}
def iso_day_to_date_tuple(year, day) when is_year(year) and is_iso_day_of_year(year, day) do
{month, first_of_month} =
cond do
:calendar.is_leap_year(year) ->
List.last(Enum.take_while(@ordinals_leap, fn {_m, odom} -> odom <= day end))
:else ->
List.last(Enum.take_while(@ordinals, fn {_m, odom} -> odom <= day end))
end
{year, month, day - (first_of_month - 1)}
end
def iso_day_to_date_tuple(year, _) when is_year(year), do: {:error, :invalid_day}
def iso_day_to_date_tuple(year, day) when is_iso_day_of_year(year, day) do
{:error, :invalid_year}
end
def iso_day_to_date_tuple(_, _), do: {:error, :invalid_year_and_day}
def days_in_month(year, month) when is_year(year) and is_month(month) do
:calendar.last_day_of_the_month(year, month)
end
def days_in_month(year, month) do
valid_year? = year > 0
valid_month? = month in @valid_months
cond do
!valid_year? && valid_month? ->
{:error, :invalid_year}
valid_year? && !valid_month? ->
{:error, :invalid_month}
true ->
{:error, :invalid_year_and_month}
end
end
@doc """
Given a {year, month, day} tuple, normalizes it so
that the day does not exceed the maximum valid days in that month
"""
def normalize_date_tuple({year, month, day}) do
# Check if we got past the last day of the month
max_day = days_in_month(year, month)
{year, month, min(day, max_day)}
end
def round_month(m) do
case mod(m, 12) do
0 -> 12
other -> other
end
end
defp mod(a, b), do: rem(rem(a, b) + b, b)
end