我是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
请您指出实现目标的正确方法
答案 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)