Elixir的日期范围?

时间:2015-10-09 19:46:37

标签: elixir

Elixir是否支持日期范围?例如,在Elixir中可能有这样的Ruby代码吗?

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

4 个答案:

答案 0 :(得分:4)

@titwalker的建议很棒。如果你想在“原生”Elixir代码中执行此操作:

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

有关此解决方案的更多信息,以及我在my blog的Elixir社区提供的大量帮助下如何设计它。但是Timex是我估计的更好的解决方案。

答案 1 :(得分:4)

使用Calendar,您可以在特定日期之后获得日期流。 例如:

alias Calendar.Date

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

如果您还想要包含第一个日期,则必须将true作为第三个参数传递。这会给你一个清单:

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}

答案 2 :(得分:3)

您可以将timex_intervaltimex结合使用来完成此操作。这是我计划在某些时候合并到timex本身的事情,因为这是一个常见的请求。

答案 3 :(得分:0)

是的

使用日期模块

range = Date.range(~D[2001-01-01], ~D[2002-01-01])

Enum.each(range, fn(x) -> IO.puts x end)

输出

2001-01-01
2001-01-02
2001-01-03
2001-01-04
2001-01-05
2001-01-06
2001-01-07
2001-01-08
2001-01-09
2001-01-10

到最后一天,即2002年1月1日