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
答案 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_interval与timex结合使用来完成此操作。这是我计划在某些时候合并到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日