Elixir中日期之间的迭代

时间:2016-10-19 05:22:34

标签: date iteration elixir

我目前正在处理日期,我希望以一天的增量在两个日期之间进行迭代。我的价值观是

timezone =
  case extractor.timezone do
    nil -> "Etc/UTC"
    _ -> extractor.timezone
  end

start_date =
  extractor.from_date
  |> Ecto.DateTime.to_erl
  |> Calendar.DateTime.from_erl!(timezone)

end_date =
  extractor.to_date
  |> Ecto.DateTime.to_erl
  |> Calendar.DateTime.from_erl!(timezone)

total_days = find_difference(end_date, start_date)
IO.inspect iterate(schedule["Friday"], start_date, timezone)

我这样做的目的是,我将在开始和结束日期之间进行迭代。在开始日期增加一天的同时,日历将会获取日期Calendar.Date.day_of_week_name的星期几,并将其传递给日程安排。

现在我正在尝试创建一个可能从开始日期到结束日期Enum的循环现在对我没有帮助。任何其他建议我如何创建循环?对于日期

更新: 我试图以这种方式循环

for _ <- 1..total_days do
  day_of_week = start_date |> Calendar.Date.day_of_week_name
  IEx.pry
  IO.inspect iterate(schedule[day_of_week], start_date, timezone)
  start_date = start_date |> Calendar.DateTime.to_erl |> Calendar.DateTime.from_erl!(timezone, {123456, 6}) |> Calendar.DateTime.add!(86400)
end

但是当循环再次启动时,它不会取值new start_date?

1 个答案:

答案 0 :(得分:1)

当然,事实并非如此。与任何其他功能语言一样,Elixir 没有可变变量。在最后一行中分配的局部变量start_date的范围是do - end。基本上,你正在做的是产生一个立即GC的新局部变量。

要收集一个值,需要一个带累加器的循环,例如: G:

1..total_days |> Enum.reduce(start_date, fn i, acc ->
  day_of_week = acc |> Calendar.Date.day_of_week_name
  IEx.pry
  IO.inspect iterate(schedule[day_of_week], start_date, timezone)
  acc |> .......
end)

现在,从块中接收值的累加器acc(最后一行结果)将存储并传递start_date

Sidenote :对于那些来自可变对象的语言来说,这看起来很混乱,但是

a = a + 1
Elixir 中的

不会更改a 的值。它_创建一个新的局部变量a,为其分配前变量a 的值。此行中LHO a和RHO a之间没有任何关联。