是否有一种快速简单的方法来获取List<DateTime>
给定的开始和结束日期?
我显然知道我可以通过循环来实现这一点,但我想知道是否有使用 Linq 或其他实用程序的更智能的方法。
注意我需要在两个给定日期之间的每一天DateTime
获取一个实例。
迭代器块对此非常有用。
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));
}
您可以这样做以获取来自startDate
to的列表endDate
:
List<DateTime> dates =
Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
.Select(n => startDate.AddDays(n))
.ToList();
惰性评估查询可能如下所示:
//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
假设您需要每日粒度,并包括开始日期和结束日期:
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));