2015-10-09 3 views
4

Имеет ли Elixir поддержку диапазонов дат? Например, может быть что-то вроде этого Ruby-кода в Elixir?Диапазон дат в Эликсире?

require 'date' 

d1 = Date::civil 2015, 1, 1 
d2 = Date::civil 2015, 1, 7 

(d1..d2).each {|d| puts d } 

Выход:

 
2015-01-01 
2015-01-02 
2015-01-03 
2015-01-04 
2015-01-05 
2015-01-06 
2015-01-07 
+1

Я так не считаю. Дата/время обработки не очень удобно в Elixir (пока?) –

ответ

4

@ предложение битвакера отличное. Если вы хотите сделать это в «родной» Эликсир код:

def generate_all_valid_dates_in_range(start_date, end_date) when start_date <= end_date do 
    (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(end_date)) 
    |> Enum.to_list 
    |> Enum.map (&(:calendar.gregorian_days_to_date(&1))) 
end 

Подробнее об этом решении, и как я придумал это с большой помощи со стороны сообщества Elixir на my blog. Но Timex - лучшее решение в моей оценке.

+1

Это отличное решение, которое не требует никаких зависимостей, к сожалению, вы ограничены итерационными днями с помощью этого подхода, но если это все, что вам нужно, вы можете уйти от того, чтобы не вводить новую зависимость. Тем не менее, если вы планируете делать что-то сложное с датами и временем, я бы использовал либо [timex] (https://github.com/bitwalker/timex), либо [calendar] (https://github.com/lau/ календарь), в зависимости от ваших потребностей – bitwalker

+0

Я недавно написал блог об этом, и идея очень похожа на вашу https://medium.com/@natetsai/implementing-date-ranges-in-elixir-384460f3b7fa#.13xic0yi0 Примечание. , в вашем предложении охраны вы сравниваете 'start_date <= end_date', что на самом деле неверно. ~ D [2016-07-02] <~ D [2016-08-01] возвращает false, а ~ D [2016-08-01] <~ D [2016-08-02] возвращает true – Jeweller

+0

@JewellerTsai NB, что все этот материал (в моем сообщении в блоге и мой ответ выше) был написан до того, как в Elixir были введены DateProtocols. –

2

Вы можете использовать timex_interval в сочетании с timex для достижения этой цели. Это то, что я планирую слить в timex сам в какой-то момент, поскольку это общий запрос.

+1

Я действительно начал работу над добавлением интервалов к timex собственно из-за этого вопроса, так что держите глаза очищенными от предстоящих выпусков! – bitwalker

3

Используя Calendar, вы можете получить поток дат после определенной даты. Пример:

alias Calendar.Date 

d1 = Date.from_erl! {2015, 1, 1} 
d2 = Date.from_erl! {2015, 1, 1} 
Date.days_after_until(d1, d2) 

Если вы хотите включить первую дату, вы должны пройти справедливо в качестве третьего аргумента. Это дало вам список:

Date.days_after_until(d1, d2, true) |> Enum.to_list 

[%Calendar.Date{day: 1, month: 1, year: 2015}, 
%Calendar.Date{day: 2, month: 1, year: 2015}, 
%Calendar.Date{day: 3, month: 1, year: 2015}, 
%Calendar.Date{day: 4, month: 1, year: 2015}, 
%Calendar.Date{day: 5, month: 1, year: 2015}, 
%Calendar.Date{day: 6, month: 1, year: 2015}, 
%Calendar.Date{day: 7, month: 1, year: 2015} 
Смежные вопросы