Packages
surgex
5.1.1
6.0.1
6.0.0
5.1.1
5.1.0
5.0.0
5.0.0-git-015aa39a
4.15.2
4.15.1
4.15.1-git-98b3
4.15.0
4.15.0-git-943e
4.15.0-git-5806
4.14.1
4.14.0
4.13.1
4.13.0
4.12.0
4.11.0
4.11.0-git-97d4
4.11.0-git-14c8
4.10.0
4.10.0-git-37f2
4.9.0
4.9.0-git-9d5f
4.8.1-git-80a7
4.8.0
4.8.0-git-fbda
4.8.0-git-e058
4.7.0
4.7.0-git-5414
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.1
4.1.1-git-9f6b
4.1.1-git-6f0cd
4.1.0
4.1.0-git-e934
4.1.0-git-8c28
4.1.0-git-56a9
4.1.0-git-55fd
4.0.0
3.2.8
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
retired
3.1.0
3.0.0
2.24.1
2.24.0
retired
2.23.0
2.22.0
2.21.0
2.20.1
2.20.0
2.19.0
2.18.1
2.18.0
2.17.0
2.16.0
2.15.0
2.14.0
2.13.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.0
2.6.0
2.5.1
2.5.0
2.4.0
retired
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.1
retired
1.3.0
retired
1.2.1
1.2.0
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
All Things Elixir @ Surge Ventures Inc, the creators of Fresha
Current section
Files
Jump to
Current section
Files
lib/surgex/date_time/date_time.ex
if Code.ensure_loaded?(Timex) do
defmodule Surgex.DateTime do
@moduledoc """
Utilities for creating date times.
"""
@doc """
Create UTC or time-zone date time given a date and seconds (from midnight) offset.
## Examples
iex> Surgex.DateTime.date_and_offset_to_datetime(~D{2021-10-07}, 5400)
{:ok, ~U[2021-10-07 01:30:00Z]}
"""
@spec date_and_offset_to_datetime(Date.t(), integer(), String.t()) ::
{:ok, DateTime.t()} | {:error, term()}
def date_and_offset_to_datetime(date, seconds_since_midnight, timezone \\ "Etc/UTC") do
with {:ok, datetime} <- NaiveDateTime.new(date, ~T[00:00:00]),
{:ok, datetime} <- shift_datetime(datetime, seconds_since_midnight),
{:ok, datetime} <- apply_timezone(datetime, timezone) do
{:ok, datetime}
else
{:error, reason} -> {:error, reason}
end
end
defp shift_datetime(datetime, offset) do
case Timex.shift(datetime, seconds: offset) do
%NaiveDateTime{} = shifted -> {:ok, NaiveDateTime.truncate(shifted, :second)}
{:error, reason} -> {:error, reason}
end
end
defp apply_timezone(datetime, timezone) do
case Timex.to_datetime(datetime, timezone) do
%DateTime{} = datetime_in_timezone ->
{:ok, datetime_in_timezone}
%Timex.AmbiguousDateTime{} = datetime ->
{:ok, datetime.after}
{:error, reason} ->
{:error, reason}
end
end
end
end