Packages
electric
1.4.4
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/pg_interop/interval/iso8601_formatter.ex
defmodule PgInterop.Interval.Iso8601Formatter do
alias PgInterop.Interval
@hour 3_600_000_000
@minute 60_000_000
@second 1_000_000
@doc """
Return a human readable string representing the duration, formatted according
to ISO8601. Negative sections will be formatted accordingly, as does PG.
## Examples
iex> format(Interval.parse!("PT2S"))
"PT2S"
iex> format(Interval.parse!("PT2.0001S"))
"PT2.0001S"
iex> format(Interval.parse!("PT1M5S"))
"PT1M5S"
iex> format(Interval.parse!("PT1M5S"))
"PT1M5S"
iex> format(Interval.parse!("P45Y6M5DT21H12M34.590264S"))
"P45Y6M5DT21H12M34.590264S"
0-length interval is special-cased to render as "0S"
iex> format(%Interval{months: 0, days: 0, microseconds: 0})
"PT0S"
"""
def format(%Interval{} = interval), do: IO.iodata_to_binary(to_iodata(interval))
@doc false
def to_iodata(%Interval{months: 0, days: 0, microseconds: 0}), do: "PT0S"
def to_iodata(%Interval{months: months, days: days, microseconds: us}) do
[
?P,
format_months(months),
format_days(days),
format_time(us)
]
end
defp format_months(months),
do: [suffix_nonzero(div(months, 12), ?Y), suffix_nonzero(rem(months, 12), ?M)]
defp format_days(days), do: suffix_nonzero(days, ?D)
defp format_time(0), do: []
defp format_time(time),
do: [
?T,
suffix_nonzero(div(time, @hour), ?H),
suffix_nonzero(div(rem(time, @hour), @minute), ?M),
format_seconds(rem(time, @minute))
]
defp format_seconds(0), do: []
defp format_seconds(us) when rem(us, @second) == 0,
do: [Integer.to_charlist(div(us, @second)), ?S]
defp format_seconds(us), do: [Float.to_charlist(us / 100_000_0.0), ?S]
defp suffix_nonzero(0, _), do: []
defp suffix_nonzero(x, suffix), do: [Integer.to_charlist(x), suffix]
end