1

是否有一种快速简单的方法来获取List<DateTime>给定的开始和结束日期?

我显然知道我可以通过循环来实现这一点,但我想知道是否有使用 Linq 或其他实用程序的更智能的方法。

注意我需要在两个给定日期之间的每一天DateTime获取一个实例。

4

4 回答 4

6

迭代器块对此非常有用。

for我认为没有理由不在这里使用循环。您需要为每个日期执行一些运算符,因为您有这么多的输出,没有任何方法会具有更好的渐近复杂度。

public static IEnumerable<DateTime> GetDates(DateTime startDate, DateTime endDate
    , TimeSpan interval)
{
    for (DateTime date = startDate; date < endDate; date.Add(interval))
    {
        yield return date;
    }
}

您也可以为固定间隔添加重载:

public static IEnumerable<DateTime> GetDays(DateTime startDate, DateTime endDate)
{
    return GetDates(startDate, endDate, TimeSpan.FromDays(1));
}
于 2013-01-14T15:30:06.247 回答
3

您可以这样做以获取来自startDateto的列表endDate

List<DateTime> dates =
  Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
  .Select(n => startDate.AddDays(n))
  .ToList();
于 2013-01-14T15:32:03.770 回答
1

惰性评估查询可能如下所示:

//inclusive start and inclusive end
public IEnumerable<DateTime> DateSequence(DateTime start, TimeSpan interval, DateTime end)
{
    DateTime current = start;
    while(current <= end)
    {
        yield return current;
        current = current.Add(interval);
    }
}

现在您可以像下面这样简单地使用它。每天设置间隔为 TimeSpan.FromDays(1)

var start = DateTime.Now;
var end = DateTime.Now.AddDays(7);
var interval = TimeSpan.FromDays(1);

var sequence = DateSequence(start, interval, end);

//LinqPad specific call
sequence.Dump();

印刷:

1/14/2013 5:34:57 PM 
1/15/2013 5:34:57 PM 
1/16/2013 5:34:57 PM 
1/17/2013 5:34:57 PM 
1/18/2013 5:34:57 PM 
1/19/2013 5:34:57 PM 
1/20/2013 5:34:57 PM 
于 2013-01-14T15:31:11.097 回答
1

假设您需要每日粒度,并包括开始日期和结束日期:

var start = new DateTime(2012, 01, 01);
var end = new DateTime(2013, 01, 01);
var daysInBetween = Enumerable.Range(0, (int) (end - start).TotalDays + 1)
                              .Select(value => start.AddDays(value));
于 2013-01-14T15:35:44.317 回答