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

本文关键字:日期 两个 之间 获取 | 更新日期: 2024-11-03 20:25:04

我想在两个日期之间获取日期。而不是预期的 9 个不同的日期,我得到了875287耗尽了内存。下面的代码会有什么问题?

StartDate01/04/2016 00:00:00

EndDate10/04/2016 00:00:00

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

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

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

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

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

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

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

看起来你的date DateTime?,你可以把这部分改成;

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

正如 usr 所指出的,这可能会对 DST 产生影响。您可能还想检查德米特里的答案。

使用

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))

如果需要它为可为空,请添加:

    .Cast<DateTime?>()

如果需要将其作为列表,请添加:

    .ToList()

它可能比其他基于 LINQ 的解决方案效率高得多。

决定用 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);