我如何从 [an Interval] 转到列表?
在 的源代码中Timex.Interval
,有一些您可以做什么的示例。这是其中一个示例的修改版本:
def days_as_strings(interval) do
interval
|> Interval.with_step([days: 1])
|> Enum.map(&Timex.format!(&1, "%Y-%m-%d", :strftime))
end
在外壳中:
~/elixir_programs/http$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> use Timex
Timex.Timezone
iex(2)> interval = Interval.new(from: ~D[2016-03-03], until: [days: 3])
%Timex.Interval{
from: ~N[2016-03-03 00:00:00],
left_open: false,
right_open: true,
step: [days: 1],
until: ~N[2016-03-06 00:00:00]
}
iex(3)> MyTime.days_as_strings(interval)
["2016-03-03", "2016-03-04", "2016-03-05"]
iex(4)>
请注意,这Enum.map()
被称为管道中的最后一步,因此无论前一行返回什么都是一个 Enumerable。好吧,Enum 模块也定义了 function Enum.to_list()
,所以让我们尝试一下,而不是Enum.map()
:
def days_as_dates(interval) do
interval
|> Interval.with_step([days: 1])
|> Enum.to_list()
end
在外壳中:
~/elixir_programs/http$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> use Timex
Timex.Timezone
iex(2)> interval = Interval.new(from: ~D[2016-03-03], until: [days: 3])
%Timex.Interval{
from: ~N[2016-03-03 00:00:00],
left_open: false,
right_open: true,
step: [days: 1],
until: ~N[2016-03-06 00:00:00]
}
iex(3)> MyTime.days_as_dates(interval)
[~N[2016-03-03 00:00:00], ~N[2016-03-04 00:00:00],
~N[2016-03-05 00:00:00]]
iex(4)>
输出显示 Enumerable 的元素是NaiveDateTime
's,它们是没有时区信息的日期时间。
该NaiveDateTime
模块定义了一个函数to_date/1
,因此我们可以映射to_date/1
到 Interval 的元素以获取Date
's:
def days_as_dates(interval) do
interval
|> Interval.with_step([days: 1])
|> Enum.map(&NaiveDateTime.to_date/1)
end
在外壳中:
~/elixir_programs/http$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Compiling 1 file (.ex)
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> use Timex
Timex.Timezone
iex(2)> interval = Interval.new(from: ~D[2016-03-03], until: [days: 3])
%Timex.Interval{
from: ~N[2016-03-03 00:00:00],
left_open: false,
right_open: true,
step: [days: 1],
until: ~N[2016-03-06 00:00:00]
}
iex(3)> MyTime.days_as_dates(interval)
[~D[2016-03-03], ~D[2016-03-04], ~D[2016-03-05]]
iex(4)>
而且,事实证明,默认步骤是[days: 1]
在您迭代 Interval 时,所以您可以只写:
def days_as_dates(interval) do
for ndt <- interval, do: NaiveDateTime.to_date(ndt)
end