两个TimeSpans之间的时间列表

时间:2014-07-12 21:23:13

标签: c# timespan

我正在尝试创建2个时间跨度之间的时间跨度列表。例如

23:55 - > 00:10

应该给我

23:55
00:00
00:05
00:10

这是我的代码,但我得到内存不足异常

var times = new List<TimeSpan>();
int interval = 5;
TimeSpan start = TimeSpan.Parse("23:55");
TimeSpan end = TimeSpan.Parse("00:00");
DateTime datum = new DateTime();
for (var dt = start; dt <= end; dt = datum.AddMinutes(interval) - datum)
{
   times.Add(dt);
}

3 个答案:

答案 0 :(得分:2)

你的基准值在这里永远不会改变,因此你会一遍又一遍地循环同一时间。你不是从开始到结束,你是从数据(从现在开始)然后每次迭代设置dt到datum.addMinutes(interval) - datum。

答案 1 :(得分:1)

我怀疑你的循环是无限的:

dt = datum.AddMinutes(interval) - datum

datum从未像interval那样发生变化,因此dt始终具有相同的值。

使用Linq而不是循环的更简洁的方法可以使用如下::

TimeSpan diff = end - start;
var times = Enumerable
           .Range(0, (int)(diff.Minutes / interval) + 1)
           .Select(x => start.Add(TimeSpan.FromMinutes(interval * x)))
           .ToList();

答案 2 :(得分:1)

你应该将日期与时间跨度进行比较。在你的代码中,例如dt <= end从一开始就是假的,因为23:55大于00:10。相反使用datetime尝试这样做(创建像我这样的虚假日期或者如果你更好地使用日期时间这个例子,一旦你看到它你会理解):

var times = new List<TimeSpan>();
double interval = 5;
//TimeSpan start = TimeSpan.Parse("23:55");
//TimeSpan end = TimeSpan.Parse("00:10");
DateTime starting = new DateTime(2014, 1, 1, 23, 55, 0);
DateTime ending = new DateTime(2014, 1, 2, 0, 10, 0);
for (var ts = starting; ts <= ending; ts = ts.AddMinutes(interval))
{
    times.Add(ts.TimeOfDay);
}

输出:

23:55
00:00
00:05
00:10