如何在C#中获取两个日期之间的日期

时间:2016-04-22 08:33:51

标签: c# linq datetime

我想知道两个日期之间的日期。而不是预期 9 不同的日期,我得到 875287 并且内存不足。下面的代码会出现什么问题?

StartDate值为01/04/2016 00:00:00

EndDate值为10/04/2016 00:00:00

var selectedDates = new List<DateTime?>();
for (var date = StartDate; date <= EndDate; date.Value.AddDays(1))
{
    selectedDates.Add(date);
}

5 个答案:

答案 0 :(得分:35)

您没有将[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 的值分配给任何内容,因此最终会以无限循环结束。您需要更改代码,以便将date.Value.AddDays(1)设置为date的结果。

AddDays

答案 1 :(得分:23)

LINQ 解决方案(让&#39; 生成 selectedDates):

  var selectedDates = Enumerable
    .Range(0, int.MaxValue)
    .Select(index => new DateTime?(StartDate.AddDays(index)))
    .TakeWhile(date => date <= EndDate)
    .ToList();

答案 2 :(得分:12)

据我所知,由于AddDays方法返回DateTime的新实例,因此更改当前实例,因为DateTimeimmutable

您的date似乎是DateTime?,您可以将此部分更改为;

for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1))
{
    selectedDates.Add(date);
}

正如我们所指出的,这个可能会在DST上受到影响。您可能也想检查Dmitry's answer

答案 3 :(得分:5)

使用Linq的Range方法的较短表示法使用能够在从末尾开始减去后使用TimeSpan.Days属性计算天数。

假设开始时间结束,你最终得到:

DateTime StartDate = new DateTime(1979, 10, 4);
DateTime EndDate = new DateTime(2016, 10, 4);

var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1)
    .Select(day => StartDate.AddDays(day))

如果您需要它可以为Nullable,请添加:

    .Cast<DateTime?>()

如果您需要此作为列表,请添加:

    .ToList()

它可能比其他基于LINQ的解决方案更有效率。

答案 4 :(得分:1)

决定用do / while

更改它
var selectedDates = new List<DateTime?>();
DateTime? StartDate = DateTime.Parse("01/04/2016 00:00:00");
DateTime? EndDate = DateTime.Parse("10/04/2016 00:00:00");

do
{
    selectedDates.Add(StartDate);
    StartDate = StartDate.Value.AddDays(1);
}while(StartDate < EndDate);