defmodule PhilomenaWeb.AppView do use PhilomenaWeb, :view @time_strings %{ seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years" } def pretty_time(time) do seconds = NaiveDateTime.diff(NaiveDateTime.utc_now(), time, :second) relation = if seconds < 0, do: "from now", else: "ago" seconds = abs(seconds) minutes = abs(div(seconds, 60)) hours = abs(div(minutes, 60)) days = abs(div(hours, 24)) months = abs(div(days, 30)) years = abs(div(days, 365)) words = cond do seconds < 45 -> String.replace(@time_strings[:seconds], "%d", to_string(seconds)) seconds < 90 -> String.replace(@time_strings[:minute], "%d", to_string(1)) minutes < 45 -> String.replace(@time_strings[:minutes], "%d", to_string(minutes)) minutes < 90 -> String.replace(@time_strings[:hour], "%d", to_string(1)) hours < 24 -> String.replace(@time_strings[:hours], "%d", to_string(hours)) hours < 42 -> String.replace(@time_strings[:day], "%d", to_string(1)) days < 30 -> String.replace(@time_strings[:days], "%d", to_string(days)) days < 45 -> String.replace(@time_strings[:month], "%d", to_string(1)) days < 365 -> String.replace(@time_strings[:months], "%d", to_string(months)) days < 548 -> String.replace(@time_strings[:year], "%d", to_string(1)) true -> String.replace(@time_strings[:years], "%d", to_string(years)) end content_tag(:time, "#{words} #{relation}", datetime: time |> NaiveDateTime.to_iso8601()) end end