【发布时间】:2022-01-13 14:34:29
【问题描述】:
我有这样的数据
[
%{since: ~T[13:30:00], till: ~T[14:30:00]},
%{since: ~T[10:30:00], till: ~T[11:30:00]}
]
我正在尝试以 15 分钟的步长生成从开始到结束(包括)之间的时间段。
所以上面的数据会导致这个
[~T[10:30:00], ~T[10:45:00], ~T[11:00:00], ~T[11:15:00], ~T[11:30:00], ~T[13:30:00], ~T[13:45:00], ~T[14:00:00], ~T[14:30:00]]
到目前为止我已经尝试过了。
Enum.map(data, fn(slot) ->
duration = Time.diff(slot.till, slot.since) / 900 |> trunc()
Enum.reduce(1..duration, [slot.since], fn _d, acc ->
step = acc |> List.last |> Time.add(900)
if Time.diff(step, slot.till) > 0 do
acc ++ [Time.add(step, 900)]
else
acc
end
end)
end)
但这只会给我
[[~T[13:30:00]], [~T[10:30:00]]]
有什么好的和简单的方法吗?我看过 Timex,但它的步进功能在这种情况下没有用。任何帮助都会非常感谢。
更新:
这行得通
Enum.map(slots, fn slot ->
duration = (Time.diff(slot.till, slot.since) / 900) |> trunc()
Enum.reduce(1..duration, [slot.since], fn _d, acc ->
step = acc |> List.last() |> Time.add(900)
if Time.diff(step, slot.till) < 0 do
[acc | [step]]
else
[acc | [slot.till]]
end
end)
end)
|> List.flatten()
|> Enum.sort()
但如果有更多内容或任何更好的方法,那也将不胜感激。
上面给出了在展平和排序之前这样的结果。
[
[
[
[[[~T[13:30:00]], ~T[13:45:00.000000]], ~T[14:00:00.000000]],
~T[14:15:00.000000]
],
~T[14:30:00.000000]
],
[
[
[[[~T[10:30:00]], ~T[10:45:00.000000]], ~T[11:00:00.000000]],
~T[11:15:00.000000]
],
~T[11:30:00.000000]
]
]
【问题讨论】:
-
请停止破坏正确答案;范围内的步长用
//step表示法指定。 hexdocs.pm/elixir/Range.html
标签: elixir