【问题标题】:generating times list with step in elixir在长生不老药中生成带有步骤的时间列表
【发布时间】: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]
  ]
]

【问题讨论】:

标签: elixir


【解决方案1】:

使用 step 处理范围更容易。为此,只需将时间转换为从午夜开始的秒数,使用范围,然后将其转换回时间实例。

data
|> Enum.flat_map(fn %{since: since, till: till} ->
  [since, till] =
    [since, till]
    |> Enum.map(&Time.to_seconds_after_midnight/1)
    |> Enum.map(&elem(&1, 0))
  Enum.map(since..till//900, &Time.from_seconds_after_midnight/1)
end)
|> Enum.sort(Time)  
#⇒ [~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:15:00], ~T[14:30:00]]

请注意,对于时隙与午夜重叠的情况,考虑到这一点,应使用条件扩展此解决方案。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多