2016-10-19 1 views
0

В настоящее время я работаю с датами, и я хочу перебирать между двумя датами по возрастанию дня. мои значения:Итерация между датами в 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 не помогает мне прямо сейчас. Любое другое предположение, что как я могу создать цикл? для даты

UPDATE: Я пытаюсь петлю таким образом

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 

Но когда начинается цикл снова не принимают значения новые START_DATE?

ответ

1

Конечно, это не так. Эликсир, как и любой другой функциональный язык, имеет без изменяемых переменных. Объем локальной переменной start_date, присвоенный в последней строке, - do - end блок. В основном, то, что вы делаете, создает новую локальную переменную, которая немедленно GC'ed.

Для сбора значения требуется петля с аккумулятором, e. г .:

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 

в эликсира не изменяет значение a. Он создает новую локальную переменную a, присваивая значение прежней переменной a. В этой строке нет связи между LHO a и RHO a.

+0

сейчас в конце мне нужно сделать как 'acc |> Calendar.DateTime.to_erl |> Calendar.DateTime.from_erl! (Timezone, {123456, 6}) |> Calendar.DateTime.add! (86400) '? – ijunaidfarooq

+0

В последней строке вы должны создать значение, которое будет передано как значение 'acc'. – mudasobwa

+0

На самом деле, я снова запустил start_date в конце, и это дало мне ошибку, поэтому спросить! – ijunaidfarooq