给出开始日期和结束日期的简单方法

时间:2013-01-14 15:26:02

标签: c# .net linq datetime

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

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

注意我需要在两个特定日期之间获得DateTime实例每天

4 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:3)

您可以这样做以获取从startDateendDate的列表:

List<DateTime> dates =
  Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
  .Select(n => startDate.AddDays(n))
  .ToList();

答案 2 :(得分: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 

答案 3 :(得分: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));
相关问题