Skip to content

Instantly share code, notes, and snippets.

@seungjin
Last active May 15, 2019 11:55
Show Gist options
  • Save seungjin/e59c17b4f7346db9fa2bfc92248b7cc0 to your computer and use it in GitHub Desktop.
Save seungjin/e59c17b4f7346db9fa2bfc92248b7cc0 to your computer and use it in GitHub Desktop.
defmodule DurationFormatter do
def format_duration(0), do: "now"
def format_duration(s) do
year = div(s, 31536000)
day = div(s - year * 31536000, 86400)
hour = div(s - year * 31536000 - day * 86400,3600)
min = div(s - year * 31536000 - day * 86400 - hour * 3600,60)
sec = rem(s,60)
a = sec [ year, day, hour, min, sec ]
b = min [ year, day, hour, min, sec ]
c = hur [ year, day, hour, min, sec ]
d = day [ year, day, hour, min, sec]
e = yea [ year, day, hour, min, sec]
#e <> d <> c <> b <> a
f = [e,d,c,b,a] |> Enum.filter(fn x->
x != ""
end)
[hd|tl] = Enum.reverse(f)
cond do
tl == [] -> hd
true -> ( Enum.reverse(tl) |> Enum.join(", ") ) <> " and " <> hd
end
end
defp sec([_,_,_,_,s]) when s == 0, do: ""
defp sec([_,_,_,_,s]) when s == 1, do: "1 second"
defp sec([_,_,_,_,s]) when s > 1, do: "#{s} seconds"
defp min([_,_,_,m,_]) when m == 0, do: ""
defp min([_,_,_,m,_]) when m == 1, do: "1 minute"
defp min([_,_,_,m,_]) when m > 1, do: "#{m} minutes"
defp hur([_,_,h,_,_]) when h == 0, do: ""
defp hur([_,_,h,_,_]) when h == 1, do: "1 hour"
defp hur([_,_,h,_,_]) when h > 1, do: "#{h} hours"
defp day([_,d,_,_,_]) when d == 0, do: ""
defp day([_,d,_,_,_]) when d == 1, do: "1 day"
defp day([_,d,_,_,_]) when d > 1, do: "#{d} days"
defp yea([y,_,_,_,_]) when y == 0, do: ""
defp yea([y,_,_,_,_]) when y == 1, do: "1 year"
defp yea([y,_,_,_,_]) when y > 1, do: "#{y} years"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment