2013-01-14 137 views
1

在给定开始日期和结束日期的情况下是否有快速且简单的方式获取List<DateTime>获取开始日期和结束日期的简单方法

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

注意我需要得到一个DateTime例如每一天,两个给定日期之间。

+0

你想把两个日期放在一个列表中......? '新列表 {dateTime1,dateTime2};' – Mir

+0

你在寻找什么样的粒度? –

+0

@MrLister我每天需要'DateTime' – davioooh

回答

3

你可以这样做,从startDateendDate获取列表:

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

这里假设间隔是一个整数天,而不是说12小时,或3分钟或3.5天等。 – Servy

+0

@Servy:是的,完全按照这个问题。 – Guffa

+0

他补充说,在编辑;在它没有指定一天的时间间隔之前。 – Servy

6

迭代器块很适合这个。

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

​​

您可以添加一个过载固定的时间间隔,以及:

public static IEnumerable<DateTime> GetDays(DateTime startDate, DateTime endDate) 
{ 
    return GetDates(startDate, endDate, TimeSpan.FromDays(1)); 
} 
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 
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)); 
相关问题