Packages
quantum
3.0.1
3.5.3
3.5.2
retired
3.5.1
retired
3.5.0
3.4.0
3.3.0
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
retired
2.3.0
retired
2.2.7
2.2.6
2.2.5
retired
2.2.4
retired
2.2.3
retired
2.2.2
retired
2.2.1
retired
2.2.0
retired
2.1.3
retired
2.1.2
retired
2.1.1
retired
2.1.0
retired
2.1.0-beta.1
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-beta.2
retired
2.0.0-beta.1
retired
1.9.3
retired
1.9.2
retired
1.9.1
retired
1.9.0
retired
1.8.1
retired
1.8.0
retired
1.7.1
retired
1.7.0
retired
1.6.1
retired
1.6.0
retired
1.5.0
retired
1.4.0
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.4
retired
1.2.3
retired
1.2.2
retired
1.2.1
retired
1.2.0
retired
1.1.0
retired
1.0.4
retired
1.0.3
retired
1.0.2
retired
1.0.1
retired
1.0.0
retired
Cron-like job scheduler for Elixir.
Current section
Files
Jump to
Current section
Files
lib/quantum/date_library.ex
defmodule Quantum.DateLibrary do
@moduledoc false
require Logger
alias Quantum.DateLibrary.{InvalidDateTimeForTimezoneError, InvalidTimezoneError}
# Convert Date to Utc
@spec to_utc!(NaiveDateTime.t(), :utc | String.t()) :: NaiveDateTime.t()
def to_utc!(date, :utc), do: date
def to_utc!(date, tz) when is_binary(tz) do
dt =
case DateTime.from_naive(date, tz) do
{:ok, dt} ->
dt
{:ambiguous, _, _} ->
raise InvalidDateTimeForTimezoneError
{:gap, _, _} ->
raise InvalidDateTimeForTimezoneError
{:error, :incompatible_calendars} ->
raise InvalidDateTimeForTimezoneError
{:error, :time_zone_not_found} ->
raise InvalidTimezoneError
{:error, :utc_only_time_zone_database} ->
Logger.warn("Timezone database not setup")
raise InvalidTimezoneError
end
case DateTime.shift_zone(dt, "Etc/UTC") do
{:ok, dt} ->
DateTime.to_naive(dt)
{:error, :utc_only_time_zone_database} ->
Logger.warn("Timezone database not setup")
raise InvalidTimezoneError
end
end
# Convert Date to TZ
@spec to_tz!(NaiveDateTime.t(), :utc | String.t()) :: NaiveDateTime.t()
def to_tz!(date, :utc), do: date
def to_tz!(date, tz) when is_binary(tz) do
result =
date
|> DateTime.from_naive!("Etc/UTC")
|> DateTime.shift_zone(tz)
case result do
{:ok, dt} ->
DateTime.to_naive(dt)
{:error, :time_zone_not_found} ->
raise InvalidTimezoneError
{:error, :utc_only_time_zone_database} ->
Logger.warn("Timezone database not setup")
raise InvalidTimezoneError
end
end
defmodule InvalidDateTimeForTimezoneError do
@moduledoc false
defexception message: "The requested time does not exist in the given timezone."
end
defmodule InvalidTimezoneError do
@moduledoc false
defexception message: "The requested timezone is invalid."
end
end