首页 > 解决方案 > 如何在 Elixir 中使用流获取日期时间列表

问题描述

如何使用具有特定间隔的流获取两个日期时间之间的 DateTime 列表。

我做了这个

stream = Stream.iterate(starting, &(Calendar.DateTime.add!(&1, 1200)))

1200 是我每次要添加到日期的间隔。

当我这样做时它工作正常。

iex(16)> {:ok, after_seconds, 0, :after} = Calendar.DateTime.diff(ending, starting)
{:ok, 691200, 0, :after}
iex(17)> chunk = after_seconds / 1200 |> trunc
576

576 是从开始日期时间到结束日期时间我需要的块值

在做

Enum.take(stream, chunk)

假设这是开始和结束日期时间

iex(14)> starting = Calendar.DateTime.from_erl!({{2020, 1, 25},{0, 29, 10}}, "Etc/UTC", {123456, 6}) |> Calendar.DateTime.shift_zone!("Europe/Dublin")
#DateTime<2020-01-25 00:29:10.123456+00:00 GMT Europe/Dublin>
iex(15)> ending = Calendar.DateTime.from_erl!({{2020, 2, 2},{0, 29, 10}}, "Etc/UTC", {123456, 6}) |> Calendar.DateTime.shift_zone!("Europe/Dublin")   
#DateTime<2020-02-02 00:29:10.123456+00:00 GMT Europe/Dublin>

但是很慢。我怎样才能让它更快?还有什么比这更好的解决方案?

out of this 应该是这样的

[#DateTime<2020-01-25 00:00:00.123456+00:00 GMT Europe/Dublin>,
 #DateTime<2020-01-25 00:20:00.123456+00:00 GMT Europe/Dublin>,
 #DateTime<2020-01-25 00:40:00.123456+00:00 GMT Europe/Dublin>,
 #DateTime<2020-01-25 01:00:00.123456+00:00 GMT Europe/Dublin>,
 ....
 #DateTime<2020-01-25 23:40:00.123456+00:00 GMT Europe/Dublin>
 ]

标签: elixir

解决方案


你真的需要一个DateTime吗?还是Date工作就好了?根据您提出问题的方式,我会尝试从 a 开始,通过 usingDate迭代,然后取您需要的任何数量。StreamDate.add


推荐阅读