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

Nau*_*nja 22 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);
}
Run Code Online (Sandbox Code Playgroud)

Doc*_*ick 35

您没有将值date.Value.AddDays(1)赋给任何东西,因此它最终会进入无限循环.您需要更改代码,以便将date其设置为结果AddDays.

for (var date = StartDate; date <= EndDate; date = date.AddDays(1))
{
    selectedDates.Add(date);
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nko 24

LINQ解决方案(让我们生成 selectedDates):

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

  • 为什么需要创建一个新的`DateTime?`?选择`StartDate.AddDays(index)`的返回值会出现什么问题? (3认同)
  • 这是最好的答案,因为它避免了增量计算,这是一种反模式。甚至不确定`AddDays(1)` 的想法是否正确。 (2认同)
  • @AshBurlaczenko:`StartDate.AddDays`的返回值为`DateTime`,但提问者在他的问题中使用了`List <DateTime?>`.`new DateTime?`只是一种强制返回值到目标类型的方法. (2认同)

Son*_*nül 12

据我所知,由于AddDays方法返回a的新实例DateTime,因此它不会更改当前实例,因为它DateTime不可变的.

看起来像你dateDateTime?,你可以改变这部分;

for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1))
{
    selectedDates.Add(date);
}
Run Code Online (Sandbox Code Playgroud)

正如我们所指出的,这可能会受到DST的影响.您可能也想检查Dmitry的答案.


jes*_*ing 5

使用Linq的Range方法的较短符号使用能够TimeSpan.Days在减去start from end之后计算出使用该属性的天数.

假设开始是在结束之前你最终得到:

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))
Run Code Online (Sandbox Code Playgroud)

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

    .Cast<DateTime?>()
Run Code Online (Sandbox Code Playgroud)

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

    .ToList()
Run Code Online (Sandbox Code Playgroud)

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