药剂。获得最低日期差异(秒/分钟/小时/天/年)

时间:2018-01-05 10:44:50

标签: elixir

我是elixir社区的新手,并试图遵循elixir方式编码,所以我需要一个建议。如何以关键字格式获取两个日期之间的最低时间差异。例如,如果时间差异小于1分钟而不是{:秒,10},如果时间差小于1小时,则为{:分钟,34},依此类推。所以我想出了解决方案

cmp = %{:seconds => 60, :minutes => 60, :hours => 24, :days => 365, :years => 100}
{_, d} = Timex.parse("2018-01-05T22:25:00-06:00", "{ISO:Extended}")
{type, value} = Enum.map(Map.keys(cmp), &({&1, Timex.diff(Timex.now, d, &1)} ))
  |> Enum.filter(fn {k, v} -> v < cmp[k] && v > 0 end)
  |> List.first

请您指出实现目标的正确方法

1 个答案:

答案 0 :(得分:1)

我相信你差不多完成了,我唯一能改进的就是从多年向下走另一个方向。这样你就不需要任何数字:

{:ok, d} = Timex.parse("2018-01-05T22:25:00-06:00", "{ISO:Extended}")

now = Timex.now
unit = 
  Enum.find(
    ~w|years days hours minutes seconds|a,
    &Timex.diff(now, d, &1) > 0))
{unit, Timex.diff(now, d, unit)}

或者,为了避免随后调用Timex.diff/3,请使用Enum.find_value/3

now = Timex.now
Enum.find_value(~w|years days hours minutes seconds|a, fn unit ->
  diff = Timex.diff(now, d, unit)
  if diff > 0, do: {unit, diff}
end)